Przejdź do innego EditText po kliknięciu Soft Keyboard Next na Androidzie

216

Kiedy nacisnę „Dalej”, fokus na tekście edycji użytkownika musi zostać przeniesiony na hasło. Następnie, od hasła, musi przejść w prawo i tak dalej. Czy możesz mi pomóc w kodowaniu?

wprowadź opis zdjęcia tutaj

<LinearLayout
    android:id="@+id/LinearLayout01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="User Name*" />

    <EditText
        android:id="@+id/txt_User"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true" />

</LinearLayout>


<LinearLayout
    android:id="@+id/LinearLayout02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password*" />

    <EditText
        android:id="@+id/txt_Password"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true"
        android:password="true" />

    <TextView
        android:id="@+id/confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password*" />

    <EditText
        android:id="@+id/txt_Confirm"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true"
        android:password="true" />

</LinearLayout>
androidBoomer
źródło
1
Spójrz na Androida: imeOptions
Tobrun
gdzie powinienem umieścić ten kod?
androidBoomer

Odpowiedzi:

473

Obsługa ostrości

Ruch ogniskowania oparty jest na algorytmie, który znajduje najbliższego sąsiada w danym kierunku. W rzadkich przypadkach domyślny algorytm może nie pasować do zamierzonego zachowania programisty.

Zmień domyślne zachowanie nawigacji kierunkowej, używając następujących atrybutów XML:

android:nextFocusDown="@+id/.."  
android:nextFocusLeft="@+id/.."    
android:nextFocusRight="@+id/.."    
android:nextFocusUp="@+id/.."  

Oprócz nawigacji kierunkowej możesz także korzystać z nawigacji po kartach. Do tego musisz użyć

android:nextFocusForward="@+id/.."

Aby uzyskać konkretny widok, na którym należy się skupić, zadzwoń

view.requestFocus()

Aby odsłuchać pewne zmieniające się zdarzenia fokusowe, użyj View.OnFocusChangeListener


Przycisk klawiatury

Możesz użyć android:imeOptionsdo obsługi tego dodatkowego przycisku na klawiaturze.

Dodatkowe funkcje, które można włączyć w edytorze IME powiązanym z edytorem, aby poprawić integrację z aplikacją. Stałe tutaj odpowiadają tym zdefiniowanym przez imeOptions.

Stałe imeOptions obejmują różnorodne akcje i flagi, zobacz ich wartości powyżej.

Przykład wartości

ActionNext :

klawisz akcji wykonuje „następną” operację, przenosząc użytkownika do następnego pola, które zaakceptuje tekst.

ActionDone :

klawisz akcji wykonuje operację „wykonaną”, co zwykle oznacza, że ​​nie ma już nic do dodania, a edytor IME zostanie zamknięty.

Przykład kodu:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="32dp"
        android:layout_marginTop="16dp"
        android:imeOptions="actionNext"
        android:maxLines="1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="24dp"
        android:imeOptions="actionDone"
        android:maxLines="1"
        android:ems="10" />

</RelativeLayout>

Jeśli chcesz słuchać wydarzeń, skorzystaj z TextView.OnEditorActionListener.

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            performSearch();
            return true;
        }
        return false;
    }
});

Tobrun
źródło
20
W moim przypadku android:nextFocusForward="@+id/.."załatwiłem sprawę .
Mr.Moustard,
23
Umieściłem android:imeOptions="actionNext"wszystkie moje EditTexts i problem zniknął. Wielkie dzięki.
Joaquin Iurchuk
3
Musiałem używać zarówno joaquin, jak i Mr.Moustard's dla każdego EditText.
Scott Biggs,
9
W mojej aplikacji po prostu użycie Androida: imeOptions = "actionNext" nie działało. EditText potrzebował Androida: inputType = "[coś]", zanim wysłucha flagi imeOptions.
Chris Kelly,
4
Skąd ma wiedzieć, na którym należy się skupić, naciskając NEXT? Czy sprawdza „prawo”, a następnie „dół”? Czy istnieje funkcja umożliwiająca skupienie identyfikatora następnego widoku, jeśli użytkownik nacisnąłby klawisz DALEJ?
programista Androida
66
android:inputType="text"

powinien przynieść ten sam efekt. Po trafieniu obok przenosi fokus do następnego elementu.

android:nextFocusDown="@+id/.."

użyj tego dodatkowo, jeśli nie chcesz, aby następny widok był aktywny

Matthias H.
źródło
34

dodaj swój editText

android:imeOptions="actionNext"
android:singleLine="true"

dodać właściwość do działania w manifeście

    android:windowSoftInputMode="adjustResize|stateHidden"

w pliku układu ScrollView ustawiony jako układ główny lub nadrzędny dla wszystkich interfejsów użytkownika

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.ukuya.marketplace.activity.SignInActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

       <!--your items-->

    </ScrollView>

</LinearLayout>

jeśli nie chcesz za każdym razem, gdy dodajesz, utwórz styl: dodaj styl w wartości / style.xml

Domyślny styl:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="editTextStyle">@style/AppTheme.CustomEditText</item>
    </style>

<style name="AppTheme.CustomEditText"     parent="android:style/Widget.EditText">
        //...
        <item name="android:imeOptions">actionNext</item>
        <item name="android:singleLine">true</item>
    </style>
Abror Esonalijew
źródło
Użycie android:singleLine="true"jest osłabione.
Praveenkumar,
18

Użyj następującego wiersza

android:nextFocusDown="@+id/parentedit"

parenteditjest identyfikatorem następnego, na EditTextktóry należy się skupić.

Powyższa linia będzie również potrzebować następującej linii.

android:inputType="text"

lub

android:inputType="number"

Dzięki za sugestię @Aleksei Chlebnikow.

Spring Breaker
źródło
3
To zadziałało dla mnie. Razem z android:inputType="text"lub android:inputType="number".
Aleksiej Chlebnikow
jeśli nextFocusDown nie będzie działać, użyj nextFocusForward. Pomogło mi to
Kishan Solanki,
android: nextFocusDown = "@ + id / parentedit" pracował dla mnie! dzięki
DIRTY DAVE,
12
android:inputType="textNoSuggestions"
android:imeOptions="actionNext"
android:singleLine="true"
android:nextFocusForward="@+id/.."

Dodanie dodatkowego pola

android: inputType = "textNoSuggestions"

działało w moim przypadku!

Tripathee Gaurav
źródło
9
<AutoCompleteTextView
                android:id="@+id/email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@drawable/user"
                android:hint="@string/username"
                android:inputType="text"
                android:maxLines="1"
                android:imeOptions="actionNext"
                android:singleLine="true" />

Te trzy linie działają magicznie

            android:maxLines="1"
            android:imeOptions="actionNext"
            android:singleLine="true"
Hitesh Kushwah
źródło
6

W module obsługi onEditorAction pamiętaj, że musisz zwrócić wartość logiczną wskazującą, czy wykonujesz akcję (prawda), czy zastosowałeś logikę i chcesz normalnego zachowania (fałsz), jak w poniższym przykładzie:

EditText te = ...
te.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // Some logic here.
            return true; // Focus will do whatever you put in the logic.
        }
        return false;  // Focus will change according to the actionId
    }
});

Znalazłem to, kiedy wróciłem do wartości true po wykonaniu mojej logiki, ponieważ fokus się nie poruszał.

użytkownik3701500
źródło
3

wystarczy użyć następującego kodu, który będzie działał poprawnie i użyje inputType dla każdego tekstu edycyjnego, a następny przycisk pojawi się na klawiaturze.

android:inputType="text" or android:inputType="number" etc
pawan kumar
źródło
2

W niektórych przypadkach może być konieczne ręczne przesunięcie fokusa do następnego pola:

focusSearch(FOCUS_DOWN).requestFocus();

Może być to potrzebne, jeśli na przykład masz pole tekstowe, które otwiera selektor daty po kliknięciu i chcesz, aby fokus automatycznie przechodził do następnego pola wprowadzania po wybraniu daty przez użytkownika i zamknięciu selektora. Nie ma sposobu, aby poradzić sobie z tym w XML, należy to zrobić programowo.

flawyte
źródło
2

Prosty sposób, gdy masz tylko kilka pól jeden po drugim:

Musisz ustawić

android:maxLines="1"

android:imeOptions="actionNext"

android:inputType="" <- Ustaw typ tekstu, w innym przypadku będzie on wielowierszowy i uniemożliwi przejście do następnego

Próba:

<EditText android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:textSize="@dimen/text_large"
              android:maxLines="1"
              android:inputType="textEmailAddress"
              android:imeOptions="actionNext"
              android:layout_marginLeft="@dimen/element_margin_large"
              android:layout_marginRight="@dimen/element_margin_large"
              android:layout_marginTop="0dp"/>
PsyhoLord
źródło
2

Spróbuj użyć Androida: imeOptions = "actionNext" znacznik dla każdego editText w widoku automatycznie ustawi fokus na następny edittext po kliknięciu Dalej na softKeyboard.

Kuldeep Rathee
źródło
1
<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView01"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:scrollbars="vertical" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="666dp"
android:background="#1500FFe5"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
    android:id="@+id/TextView02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editGrWt"
    android:layout_marginTop="14dp"
    android:layout_toLeftOf="@+id/textView3"
    android:ems="6"
    android:text="    Diamond :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />
  <EditText
    android:id="@+id/editDWt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/TextView02"
    android:layout_alignLeft="@+id/editGrWt"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:nextFocusLeft="@+id/editDRate"
    android:selectAllOnFocus="true"
    android:imeOptions="actionNext"

    />
 <requestFocus />


<TextView
    android:id="@+id/TextView03"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/TextView02"
    android:layout_below="@+id/TextView02"
    android:layout_marginTop="14dp"
    android:ems="6"
    android:text="    Diamond :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />

<EditText
    android:id="@+id/editDWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/TextView03"
    android:layout_alignBottom="@+id/TextView03"
    android:layout_alignLeft="@+id/editDWt"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:text="0"
    android:selectAllOnFocus="true"
    android:imeOptions="actionNext"/>
 <requestFocus />

<TextView
    android:id="@+id/TextView04"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editDWt1"
    android:layout_marginTop="14dp"
    android:layout_toLeftOf="@+id/textView3"
    android:ems="6"
    android:text="         Stone :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />

<EditText
    android:id="@+id/editStWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/TextView04"
    android:layout_alignBottom="@+id/TextView04"
    android:layout_alignLeft="@+id/editDWt1"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:nextFocusForward="@+id/editStRate1"
    android:imeOptions="actionNext" />
 <requestFocus />
  <TextView
     android:id="@+id/TextView05"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignLeft="@+id/TextView04"
     android:layout_below="@+id/editStRate1"
     android:layout_marginTop="14dp"
     android:ems="6"
     android:text="         Stone :"
     android:textColor="@color/background_material_dark"
     android:textSize="15sp" />


</RelativeLayout>

</ScrollView>
Nilkanth vithani
źródło
4
Możesz podać wyjaśnienie z odpowiedzią, aby wyjaśnić, dlaczego twoje jest lepsze od innych. Możesz nacisnąć przycisk „edytuj”, aby dodać do swojej odpowiedzi.
Brian Tompsett - 汤 莱恩
1

Jeśli chcesz używać multilinii EditTextz imeOptions, spróbuj:

android:inputType="textImeMultiLine"
Chris
źródło
1

Dodaj inputType do edittext, a po wejściu przejdzie do następnego edittext

android:inputType="text"
android:inputType="textEmailAddress"
android:inputType="textPassword" 

i wiele więcej.

inputType = textMultiLine nie przechodzi do następnego edycji tekstu po wejściu

Sharmad Desai
źródło
1

W Kotlin użyłem Bellow jak ...

  1. xml:

    <EditText
      android:id="@+id/et_amount"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:imeOptions="actionNext"
      android:inputType="number"
      android:singleLine="true" />
  2. w kotlin:

    et_amount.setOnEditorActionListener { v, actionId, event ->
    
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // do some code
            true
        } else {
            false
        }
    }
Enamul Haque
źródło
0
Inside Edittext just arrange like this


<EditText
    android:id="@+id/editStWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:imeOptions="actionNext" //now its going to rightside/next field automatically
    ..........
    .......

</EditText>
Kishore Reddy
źródło
0

Jeśli masz element w widoku przewijania, możesz również rozwiązać ten problem, ponieważ:

<com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_password"
                android:inputType="textPassword"
                android:focusable="true"
                android:imeOptions="actionNext"
                android:nextFocusDown="@id/ed_confirmPassword" />

a w twojej działalności:

edPassword.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_NEXT) {
                focusOnView(scroll,edConfirmPassword);
                return true;
            }
            return false;
        }
    });

public void focusOnView(ScrollView scrollView, EditText viewToScrollTo){
    scrollView.post(new Runnable() {
        @Override
        public void run() {
            scrollView.smoothScrollTo(0, viewToScrollTo.getBottom());
            viewToScrollTo.requestFocus();
        }
    });
}
Abdullah Hashmi
źródło
0

Prosta droga :

  • Automatycznie przenieś kursor do następnego tekstu edycji
  • Jeśli edittext jest ostatnim wejściem -> ukryta klawiatura

Dodaj to do pola edittext w pliku .xml

android:inputType="textCapWords"
vuhoanghiep1993
źródło