Mover para outro EditText quando clicar em Soft Keyboard Next no Android

216

Quando pressiono o botão 'Next', o foco no User EditText deve passar para a senha. Em seguida, na Senha, ele deve se mover para a direita e assim por diante. Você pode me ajudar em como codificá-lo?

insira a descrição da imagem aqui

<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
fonte
1
Dê uma olhada no android: imeOptions
Tobrun
onde devo colocar esse código?
AndroidBoomer

Respostas:

473

Manuseio de foco

O movimento do foco é baseado em um algoritmo que encontra o vizinho mais próximo em uma determinada direção. Em casos raros, o algoritmo padrão pode não corresponder ao comportamento pretendido do desenvolvedor.

Altere o comportamento padrão da navegação direcional usando os seguintes atributos XML:

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

Além da navegação direcional, você pode usar a navegação por guias. Para isso, você precisa usar

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

Para obter uma visualização específica para focar, ligue para

view.requestFocus()

Para ouvir certos eventos de mudança de foco, use um View.OnFocusChangeListener


Botão do teclado

Você pode usar android:imeOptions para manipular esse botão extra no teclado.

Recursos adicionais que você pode ativar em um IME associado a um editor para melhorar a integração com seu aplicativo. As constantes aqui correspondem àquelas definidas por imeOptions.

As constantes de imeOptions incluem uma variedade de ações e sinalizadores; veja os valores acima no link acima.

Exemplo de valor

ActionNext :

a chave de ação executa uma operação "próxima", levando o usuário ao próximo campo que aceitará o texto.

ActionDone :

a chave de ação executa uma operação "concluída", normalmente significando que não há mais nada a ser inserido e o IME será fechado.

Exemplo de código:

<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>

Se você quiser ouvir eventos de imooptions, use a 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
fonte
20
No meu caso, android:nextFocusForward="@+id/.."fiz o truque.
Mr.Moustard
23
Eu coloquei android:imeOptions="actionNext"em todos os meus EditTexts e o problema se foi. Muito obrigado.
Joaquin Iurchuk
3
Eu tive que usar joaquin e Mr.Moustard para cada EditText.
22816 Scott Biggs
9
Para o meu aplicativo, basta usar o android: imeOptions = "actionNext" não funcionou. O EditText precisava do android: inputType = "[something]" antes de ouvir o sinalizador imeOptions.
Chris Kelly
4
Como ele sabe qual deles deve ser focado ao pressionar NEXT? Ele verifica o "certo" e depois o "inativo"? Existe uma função para focar a identificação da próxima exibição, se o usuário pressionar a tecla NEXT?
desenvolvedor Android
66
android:inputType="text"

deve trazer o mesmo efeito. Depois de pressionar próximo para trazer o foco para o próximo elemento.

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

use isso além disso, se você não quiser que a próxima visualização obtenha o foco

Matthias H
fonte
34

adicione seu editText

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

adicionar propriedade à atividade no manifesto

    android:windowSoftInputMode="adjustResize|stateHidden"

no arquivo de layout ScrollView definido como raiz ou layout pai, todas as interfaces de usuário

<?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>

se você não quiser toda vez que adicionar, crie estilo: adicione estilo em values ​​/ style.xml

padrão / estilo:

<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 Esonaliyev
fonte
O uso de android:singleLine="true"é privado.
Praveenkumar 18/09/19
18

Use a seguinte linha

android:nextFocusDown="@+id/parentedit"

parentedité o ID do próximo EditTexta ser focado.

A linha acima também precisará da seguinte linha.

android:inputType="text"

ou

android:inputType="number"

Obrigado pela sugestão @Alexei Khlebnikov.

Spring Breaker
fonte
3
Funcionou para mim. Juntamente com android:inputType="text"ou android:inputType="number".
Alexei Khlebnikov
se nextFocusDown não funcionar, use nextFocusForward. Ajudou-me #
314 Kishan Solanki
android: nextFocusDown = "@ + id / parentedit" funcionou para mim! obrigado
DIRTY DAVE
12
android:inputType="textNoSuggestions"
android:imeOptions="actionNext"
android:singleLine="true"
android:nextFocusForward="@+id/.."

Adicionando campo extra

android: inputType = "textNoSuggestions"

trabalhou no meu caso!

Tripathee Gaurav
fonte
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" />

Essas três linhas fazem a mágica

            android:maxLines="1"
            android:imeOptions="actionNext"
            android:singleLine="true"
Hitesh Kushwah
fonte
6

No manipulador onEditorAction, lembre-se de que você deve retornar um booleano que indica se está manipulando a ação (true) ou se aplicou alguma lógica e deseja o comportamento normal (false), como no exemplo a seguir:

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
    }
});

Encontrei isso quando retornei verdadeiro depois de executar minha lógica, pois o foco não se moveu.

user3701500
fonte
3

basta usar o código a seguir, ele funcionará bem e usar inputType para cada edittext e o próximo botão aparecerá no teclado.

android:inputType="text" or android:inputType="number" etc
pawan kumar
fonte
2

Em alguns casos, pode ser necessário mover o foco para o próximo campo manualmente:

focusSearch(FOCUS_DOWN).requestFocus();

Pode ser necessário se, por exemplo, você tiver um campo de texto que abre um seletor de datas ao clicar e desejar que o foco passe automaticamente para o próximo campo de entrada assim que uma data for selecionada pelo usuário e o seletor fechar. Não há como lidar com isso em XML, isso deve ser feito programaticamente.

flawyte
fonte
2

Maneira simples, quando você tem apenas alguns campos, um por um:

Precisa definir

android:maxLines="1"

android:imeOptions="actionNext"

android:inputType="" <- Defina seu tipo de texto, caso contrário, ele será multilinha e impedirá que você avance

Amostra:

<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
fonte
2

Tente usar a tag android: imeOptions = "actionNext" para cada editText na tela Visualizar, ela será automaticamente focada no próximo edittext quando você clicar em Avançar no softKeyboard.

Kuldeep Rathee
fonte
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
fonte
4
Você pode colocar uma explicação na sua resposta para explicar por que a sua é melhor do que as outras. Você pode pressionar o botão "editar" para adicionar à sua resposta.
Brian Tompsett - #
1

Se você quiser usar uma multilinha EditTextcom imeOptions, tente:

android:inputType="textImeMultiLine"
Chris
fonte
1

Adicione inputType ao edittext e, ao entrar, ele passará ao próximo edittext

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

e muitos mais.

inputType = textMultiLine não vai para o próximo edittext em enter

Sharmad Desai
fonte
1

No Kotlin, usei o Bellow como ..

  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. no kotlin:

    et_amount.setOnEditorActionListener { v, actionId, event ->
    
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // do some code
            true
        } else {
            false
        }
    }
Enamul Haque
fonte
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
fonte
0

Se você tiver o elemento na exibição de rolagem, também poderá resolver esse problema como:

<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" />

e na sua atividade:

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
fonte
0

Maneira simples :

  • Mover automaticamente o cursor para o próximo edittext
  • Se edittext for a última entrada -> teclado oculto

Adicione isso ao campo edittext no arquivo .xml

android:inputType="textCapWords"
vuhoanghiep1993
fonte