2017-07-27 8 views
7

Oto mój EditText: -Ustawianie imeOptions EditText do actionNext nie ma wpływu przy użyciu cyfr

<com.os.fastlap.util.customclass.EditTextPlayRegular 
        android:id="@+id/full_name_et" 
        style="@style/Edittext_white_13sp" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="@dimen/_5sdp" 
        android:background="#00ffffff" 
        android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
        android:imeOptions="actionNext" 
        android:inputType="text" 
        android:maxLength="20" 
        android:maxLines="1" 
        android:nextFocusDown="@+id/last_name_et" 
        android:textCursorDrawable="@null" /> 

Kiedy usunąć digit w EditText to działa dobrze, ale z digitimeOptions nie działa. Ale jedna zaskakująca rzecz, jeśli używam singleLine zamiast maxLines, działa dobrze. Ale teraz singleLine jest przestarzałe. Nie mogę usunąć cyfry w moim edytorze tekstu i nie chcę używać przestarzałej metody. Każdy może rozwiązać ten problem. Dzięki w adavance

+1

używam 'android: focusableInTouchMode = "true"', ale bez zmian. –

Odpowiedz

3

Oto uproszczony rozwiązanie z przycisku klawiatury oprogramowania „Next”:

final String NOT_ALLOWED_CHARS = "[^a-zA-Z0-9]+"; 

final EditText editText = (EditText) findViewById(R.id.editText); 
editText.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) { 
      if (!TextUtils.isEmpty(s)) { 
       // remove the listener to avoid StackoverflowException 
       editText.removeTextChangedListener(this); 
       // replace not allowed characters with empty strings 
       editText.setText(s.toString().replaceAll(NOT_ALLOWED_CHARS, "")); 
       // setting selection moves the cursor at the end of string 
       editText.setSelection(editText.getText().length()); 
       // add the listener to keep watching 
       editText.addTextChangedListener(this); 
      } 
     } 
    }); 

Tutaj wyrażenie regularne [^a-zA-Z0-9]+ odpowiada dozwolonych wartościach android:digits z EditText w pytaniu.

0

android:digits określa, że ​​EditText ma numeryczną metodę wprowadzania, zgodnie docs

Można użyć android:inputType="personName" aby osiągnąć takie same jak obecnego digits attr

1

Problem jesteś kliknięcie na klucz zamiast actionNext trzeba, aby przesunąć kursor do najbliższego EditText

Określ Input Method akcji Wpisz

Najbardziej miękkie metody wprowadzania zapewniają przycisk akcji użytkownika w dolnym rogu odpowiedni dla bieżącego pola tekstowego. Domyślnie system używa tego przycisku do działania Następna lub Gotowa, chyba że pole tekstowe zezwala na tekst wieloliniowy (na przykład z android: inputType = "textMultiLine"), w którym to przypadku przycisk czynności to karetka powrót. Można jednak określić dodatkowe akcje, które mogą być bardziej odpowiednie dla pola tekstowego, na przykład Wyślij lub Przejdź.

Powoduje powrót karetki do przycisku akcji. Więc oznacza to, że nie ognia android:nextFocusDown

Przede wszystkim, pozwala zobaczyć, co jest różnica między SingleLine która jest przestarzała i maxLines

SingleLine

Kiedy zestaw android:singleLine="true" jedna linia tekstu jest w EditText widoczny, ale klawisz Enter nie jest widoczny na klawiaturze

maxLines

po ustawieniu atrybutu android:maxLines z określoną wartością tylko ta sama ilość tekstu liniowego jest widoczna w EditText i klawisz Enter na klawiaturze widoczny również dla Wprowadzanie.

Po kliknięciu przycisku akcji następuje uruchomienie akcji zgodnie z kodem. Również trzeba zmienić atrybut InputType z android:inputType="textMultiLine" jeśli używasz atrybutu android:maxLines

maxLines

dodanych w API poziom 1 int maxLines Powoduje TextView być co najwyżej to wiele linii wysoki.W przypadku użycia w edytowalnym tekście, wartość atrybutu inputType musi być połączona z flagą textMultiLine dla atrybutu maxLines do zastosowania.

Może być wartością całkowitą, np. "100".


Kiedy dostosować swój kod z odpowiednimi atrybutami nadal było strzelających klucz zamiast IME_ACTION_NEXT którego chcesz Enter. Myślę, że to nie rozwiąże problemu z powodu

textMultiLine Może być łączony z tekstem i jego odmian, aby umożliwić wiele wierszy tekstu w polu. Jeśli ta flaga nie zostanie ustawiona, pole tekstowe zostanie ograniczone do pojedynczej linii. Odpowiada TYPE_TEXT_FLAG_MULTI_LINE.


TYPE_TEXT_FLAG_MULTI_LINE

dodano poziomu API 3 int TYPE_TEXT_FLAG_MULTI_LINE Flag dla TYPE_CLASS_TEXT: wielokrotne linie tekstu mogą być wprowadzone w dziedzinie. Jeśli ta flaga nie jest ustawiona, pole tekstowe zostanie ograniczone do pojedynczej linii . IME może również nie wyświetlać klawisza Enter, gdy ta flaga nie jest ustawiona, ponieważ nie powinno być potrzeby tworzenia nowych linii.

Stała Wartość: 131072 (0x00020000)


ROZWIĄZANIE:

Podklasa EditText i dostosować opcje IME. Po tym czasie nie potrzebujesz atrybutów android:maxLines ani android:singleLine.

@Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     InputConnection connection = super.onCreateInputConnection(outAttrs); 
     int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION; 
     if ((imeActions&EditorInfo.IME_ACTION_NEXT) != 0) { 
      // clear the existing action 
      outAttrs.imeOptions ^= imeActions; 
      // set the DONE action 
      outAttrs.imeOptions |= EditorInfo.IME_ACTION_NEXT; 
     } 
     if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) { 
      outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; 
     } 
     return connection; 
    } 

Możesz również sprawdzić inny wpis here. I rekonfiguracji przyjętej odpowiedzi na to stanowisko na celu

2

można użyć

android:lines="1" 

zamiast

android:maxLines 

lub

android:singleLine="true". 

wiem wypróbowaniu wiele rozwiązań, spróbuj z

android:lines="1" 

te, jeśli wcześniej nie próbowano.

0

android:maxLines Sprawia tylko TextView być najwyżej to wiele linii wysoki, nie przeszkadza użytkownikowi z wejścia większej liczby znaków.

To samo z android:lines, które tylko sprawia, że ​​TextView będzie dokładnie tyle linii wysoki.

0

Kod obejście rozwiązania są jak poniżej,

XML File

<EditText 
      android:id="@+id/full_name_et" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="5sp" 
      android:background="#00ffffff" 
      android:imeOptions="actionNext" 
      android:inputType="text" 
      android:maxLines="1" 
      android:maxLength="20" 
      android:textCursorDrawable="@null" /> 

Java:

final EditText edtfirstName = (EditText) findViewById(R.id.full_name_et); 


    edtfirstName.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 
      if (charSequence.toString().startsWith(" ")) { 
       String result = charSequence.toString().replace(" ", "").replaceAll("[^a-zA-Z]+", ""); 
       if (!charSequence.toString().equals(result)) { 
        edtfirstName.setText(result); 
        edtfirstName.setSelection(result.length()); 
       } 
      } else { 
       String result = charSequence.toString().replaceAll("[^a-zA-Z ]+", ""); 
       if (!charSequence.toString().equals(result)) { 
        edtfirstName.setText(result); 
        edtfirstName.setSelection(result.length()); 
       } 
      } 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
Powiązane problemy