Duże litery w EditText

383

Pracuję nad małą osobistą aplikacją do listy rzeczy do zrobienia i do tej pory wszystko działało całkiem dobrze. Jest jedno małe dziwactwo, które chciałbym zrozumieć. Ilekroć idę, aby dodać nowy element, mam okno dialogowe z widokiem EditText pokazującym wewnątrz. Kiedy wybieram widok EditText, klawiatura pojawia się, aby wprowadzić tekst, tak jak powinien. W większości aplikacji domyślnie wydaje się, że klawisz Shift jest przytrzymywany dla pierwszej litery ... chociaż nie robi tego dla mojego widoku. Musi istnieć prosty sposób, aby to naprawić, ale wielokrotnie przeszukiwałem referencję i nie mogę jej znaleźć. Myślę, że musi istnieć atrybut xml dla referencji ładowanej przez Adapter, ale nie mogę się dowiedzieć, co to jest.

Maximus
źródło

Odpowiedzi:

805

Statycznie (tzn. W pliku XML układu): ustaw android:inputType="textCapSentences"na swoim EditText.

Programowo: trzeba to InputType.TYPE_CLASS_TEXTw InputTypez EditText, na przykład

EditText editor = new EditText(this); 
editor.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);

Można łączyć z tekstem i jego odmianami, aby zażądać wielkich liter pierwszego znaku każdego zdania.

- Dokumenty Google

McStretch
źródło
5
testEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); lub android: inputType = "textCapSentences" będzie działał tylko wtedy, gdy włączona jest funkcja Auto Capitalize Setting na klawiaturze urządzenia.
Lakshmanan,
8
Dlaczego włączenie tej opcji powoduje, że my android:lines="7"nie pokazuje już 7 linii (teraz domyślnie wraca do 1 linii)
James Wierzba
3
estEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); lub android: inputType = "textCapSentences" będzie działał tylko wtedy, gdy włączona jest funkcja Auto Capitalize Setting na klawiaturze urządzenia. Jaka jest alternatywa programowo?
Swift
@JamesWierzba Odniosę się tutaj do odpowiedzi Shivang jako odpowiedzi na obsługę wielu linii. Dodaj Androida: inputType = "textCapSentences | textMultiLine"
Lenin
76

Wystarczy użyć android:inputType="textCapWords"w elemencie EditText.

Na przykład:

<EditText
    android:id="@+id/txtName"
    android:layout_width="0dp"
    android:layout_height="40dp"
    android:layout_weight="0.7"
    android:inputType="textCapWords"
    android:textColorHint="#aaa"
    android:hint="Name Surname"
    android:textSize="12sp" />

Odwołaj się do następującego łącza: http://developer.android.com/reference/android/widget/TextView.html#attr_android%3ainputType

Mangi Morobe
źródło
Dobrą praktyką jest zaznaczanie kodu w elemencie kodu zamiast pogrubienia go.
Ravi Bhatt
13
Ta odpowiedź tak naprawdę nie pomaga na pytanie OP. Spowoduje to wstawienie pierwszego znaku dla każdego słowa , a nie pierwszego znaku tekstu wejściowego (który jest traktowany jako zdanie). Chociaż może to prawdopodobnie pomóc innym, poprawna odpowiedź jest odpowiedzią zaakceptowaną.
Andrew T.,
37

Zastosuj następujący wiersz w EditText w XML.

android:inputType="textCapSentences|textMultiLine"

Umożliwi także obsługę wielu linii.

Shivang
źródło
2
To powinna być zaakceptowana odpowiedź, ponieważ jest to jedyne rozwiązanie, które nie zwinie EditText w jednym wierszu
egorikem
31
testEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   

lub android:inputType="textCapSentences"będzie działać tylko, jeśli włączona jest funkcja automatycznego ustawiania wielkich liter na klawiaturze urządzenia.

Lakszmanan
źródło
Dzięki, utknąłem, ponieważ właśnie wyłączyłem ustawienia klawiatury Auto Capitalize Setting
Pulkit
20

Napotkałem ten sam problem, po prostu dzieląc się tym, co odkryłem. Może pomóc tobie i innym ...

Wypróbuj to na swoim układzie. Dodaj poniższy wiersz w swoim EditText.

android:inputType="textCapWords|textCapSentences"

działa dobrze na mnie .. mam nadzieję, że działa również na ciebie ...

użytkownik4144348
źródło
5

Zapewniam cię, że obie odpowiedzi sprawią, że pierwsza litera będzie duża i nie utworzą pojedynczego wiersza.

Jeśli chcesz to zrobić w XMl poniżej, jest kod

android:inputType="textCapWords|textCapSentences"

Jeśli chcesz to zrobić w działaniu / fragmencie itp. Poniżej znajduje się kod

momentTextView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_MULTI_LINE)

PS: Jeśli masz inną właściwość, możesz ją łatwo dodać za pomocą potoku „|” symbol, po prostu upewnij się, że między właściwościami atrybutu nie ma spacji w pliku XML

Tushar Srivastava
źródło
5

Dla wielkich liter w EditText możesz wybrać dwa poniższe typy wprowadzania:

  1. android: inputType = "textCapSentences"
  2. android: inputType = "textCapWords"

textCapSentences
Pozwoli to pierwszej literze pierwszego słowa jako Stolicy w każdym zdaniu.

textCapWords Spowoduje to, że pierwsza litera każdego słowa będzie wielka .

Jeśli chcesz oba atrybuty, po prostu użyj | podpisać za pomocą obu atrybutów

android:inputType="textCapSentences|textCapWords"
anand tripathi
źródło
3

Wypróbuj ten kod, użyje on pierwszego znaku wszystkich słów.

- ustaw addTextChangedListener dla widoku EditText

edt_text.addTextChangedListener (watcher);

- Dodaj TextWatcher

TextWatcher watcher = new TextWatcher() {
    int mStart = 0;

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        mStart = start + count;
    }

    @Override
    public void afterTextChanged(Editable s) {
        String input = s.toString();
        String capitalizedText;
        if (input.length() < 1)
            capitalizedText = input;
        else if (input.length() > 1 && input.contains(" ")) {
            String fstr = input.substring(0, input.lastIndexOf(" ") + 1);
            if (fstr.length() == input.length()) {
                capitalizedText = fstr;
            } else {
                String sstr = input.substring(input.lastIndexOf(" ") + 1);
                sstr = sstr.substring(0, 1).toUpperCase() + sstr.substring(1);
                capitalizedText = fstr + sstr;
            }
        } else
            capitalizedText = input.substring(0, 1).toUpperCase() + input.substring(1);

        if (!capitalizedText.equals(edt_text.getText().toString())) {
            edt_text.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    edt_text.setSelection(mStart);
                    edt_text.removeTextChangedListener(this);
                }
            });
            edt_text.setText(capitalizedText);
        }
    }
};
Dharmesh Patel
źródło
3

Aby używać wielkich liter, możesz wykonać następujące czynności, edytując tekst:

Aby utworzyć pierwszą literę każdego słowa :

android:inputType="textCapWords"

Aby utworzyć pierwszą literę każdego zdania :

android:inputType="textCapSentences"

Aby każda litera była wielka:

android:inputType="textCapCharacters"

Spowoduje to jednak jedynie zmiany w klawiaturze, a użytkownik może zmienić tryb pisania literą w małych literach.

Więc to podejście nie jest bardzo doceniane, jeśli naprawdę chcesz, aby dane były w formacie wielkich liter, najpierw dodaj następującą klasę:

public class CapitalizeFirstLetter {
    public static String capitaliseName(String name) {
        String collect[] = name.split(" ");
        String returnName = "";
        for (int i = 0; i < collect.length; i++) {
            collect[i] = collect[i].trim().toLowerCase();
            if (collect[i].isEmpty() == false) {
                returnName = returnName + collect[i].substring(0, 1).toUpperCase() + collect[i].substring(1) + " ";
            }
        }
        return returnName.trim();
    }
    public static String capitaliseOnlyFirstLetter(String data)
    {
        return data.substring(0,1).toUpperCase()+data.substring(1);
    }
}

I wtedy,

Teraz wielkie litery każdego słowa:

CapitalizeFirstLetter.capitaliseName(name);

Aby używać tylko pierwszego słowa:

CapitalizeFirstLetter.capitaliseOnlyFirstLetter(data);
Suraj Vaishnav
źródło
2

Ustaw typ danych wejściowych w XML, a także w pliku JAVA w ten sposób,

W XML

android: inputType = "textMultiLine | textCapSentences"

Pozwoli również na wieloliniowy oraz w pliku JAVA,

edittext.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);

upewnij się, że ustawienie Automatycznej kapitalizacji na klawiaturze jest włączone .

Siddharth Sheth
źródło
2

W pliku XML układu:

  • zestaw android:inputType="textCapSentences"

  • Na EditTextmasz pierwszy alfabet pierwszego słowa każdego zdania jako kapitał

  • Lub android:inputType="textCapWords"w tekście EditText, aby mieć pierwszy alfabet każdego słowa jako wielką literę

Himmat Gill
źródło
1

użyj tego kodu, aby użyć tylko wielkich liter w EditText

MainActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:tag="true">
    </EditText>

</RelativeLayout>

MainActivity.java

EditText et = findViewById(R.id.et);
        et.addTextChangedListener(new TextWatcher() {
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
            {
                if (et.getText().toString().length() == 1 && et.getTag().toString().equals("true"))
                {
                    et.setTag("false");
                    et.setText(et.getText().toString().toUpperCase());
                    et.setSelection(et.getText().toString().length());
                }
                if(et.getText().toString().length() == 0)
                {
                    et.setTag("true");
                }
            }

            public void afterTextChanged(Editable editable) {

            }
        });
Milan Pithadia
źródło
0

Wcześniej był android:capitalize="words", a obecnie jest przestarzały. Zalecaną alternatywą jest użycieandroid:inputType="textCapWords"

Pamiętaj, że zadziała to tylko wtedy, gdy włączona jest funkcja automatycznego ustawiania wielkich liter na klawiaturze urządzenia.

Aby to zrobić programowo, użyj następującej metody:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);

Mahendra Liya
źródło
0

założyłem i moje rozwiązanie: masz 2 sposoby na rozwiązanie tego w java:

 testEditText.setInputType(InputType.TYPE_CLASS_TEXT 
 | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   

i xml:

 <EditText
android:id="@+id/mytxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapWords"
android:textSize="12sp" />

źródło
0

Programowo

TextView firstline = (TextView) findViewById(R.id.firstline);
firstline.setAllCaps(true);
Rajesh Tiwari
źródło
0

jeśli piszesz style w styles.xml, to

usuń właściwość android: inputType i dodaj poniższe wiersze

<item name="android:capitalize">words</item>
Sai Gopi N.
źródło