Pergunta

Eu estou querendo saber se existe uma maneira de lidar com o usuário pressionar Entrar durante a digitação em um EditText, algo assim como o HTML onSubmit do evento.

Também queria saber se há uma maneira de manipular o teclado virtual, de tal forma que o botão "Concluído" é rotulado de algo (por exemplo, "Ir") e executa uma determinada ação quando clicado (novamente, como onSubmit).

Foi útil?

Solução

Estou me perguntando se existe uma maneira de lidar com o usuário pressionando Digitar Enquanto digitava em um EditText, algo como o evento HTML onSubmit.

Sim.

Também se perguntando se existe uma maneira de manipular o teclado virtual de tal maneira que o botão "feito" é rotulado de outra coisa (por exemplo "Go") e executa uma certa ação quando clicada (novamente, como o Submit).

Também sim.

Você vai querer olhar para o android:imeActionId e android:imeOptions atributos, mais o setOnEditorActionListener() método, tudo em TextView.

Para alterar o texto do botão "feito" para uma string personalizada, use:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

Outras dicas

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

Aqui está o que você faz.É também oculto no Android Developer 'código de exemplo Bluetooth Chat".Substitua o negrito peças que dizer "exemplo" com suas próprias variáveis e métodos.

Primeiro, importe o que você precisa em que a Actividade principal onde você deseja que o botão voltar para fazer algo especial:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

Agora, faça uma variável do tipo TextView.OnEditorActionListener para a sua tecla de retorno (aqui eu uso exampleListener);

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

Em seguida, você precisa dizer ao ouvinte duas coisas sobre o que fazer quando o retorno botão é pressionado.Ele precisa saber o que EditText estamos falando (aqui eu uso exampleView) e, em seguida, ele precisa saber o que fazer quando a tecla Enter é pressionada (aqui, example_confirm()).Se este é o último ou único EditText em sua Atividade, ele deve fazer a mesma coisa que o método onClick para o seu Submeter (ou OK, Confirmar, Enviar, Salvar, etc) botão.

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

Finalmente, defina o ouvinte (o mais provável no seu método onCreate);

exampleView.setOnEditorActionListener(exampleListener);

Os teclados de hardware sempre produzem eventos, mas os teclados de software retornam diferentes ActionIds e NULLS em Singleline EdittExts. Este código responde toda vez que o usuário pressiona Enter em um EditText que esse ouvinte foi definido, independentemente do tipo EditText ou do teclado.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

A aparência padrão da tecla Enter em SingLeline = False fornece uma seta dobrada, enter o teclado. Quando SingLeline = true no último edittext, a chave diz terminada, e no EdittExts antes, diz a seguir. Por padrão, esse comportamento é consistente em todos os emuladores de baunilha, Android e Google. O atributo scrollhorizontal não faz diferença. O teste nulo é importante porque a resposta dos telefones a soft entra é deixada para o fabricante e, mesmo nos emuladores, os emuladores de nível 16 de baunilha respondem a um longo e suave entra em várias linhas e scrollhorizontal edittExts com um actionId do próximo e um nulo para o NULL para o evento.

Eu sei que isso tem um ano, mas acabei de descobrir que isso funciona perfeitamente para um EdittExt.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

Impede tudo menos texto e espaço. Eu não conseguia guiar, "retornar" (" n"), ou qualquer coisa.

Esta página descreve exatamente como fazer isso.

https://developer.android.com/training/keyboard-input/style.html

Colocou o Android: imeoptions Então você apenas verifica o ActionId em OneditorAction. Portanto, se você definir imeOptions como 'ActionDone', verá a 'ActionId == editorInfo.ime_action_done' no OneDitorAction. Além disso, certifique -se de definir o Android: InputType.

Aqui está o EditText do exemplo vinculado acima:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Você também pode definir isso programaticamente usando o setimeoptions (int) função. Aqui está o OneditorActionListener do exemplo vinculado acima:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

Assim como um adendo à resposta de Chad (que funcionou quase perfeitamente para mim), descobri que precisava adicionar uma verificação no tipo de ação keyevent para impedir que meu código seja executado duas vezes (uma vez no key-up e uma vez no Key-Down evento).

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

Ver http://developer.android.com/reference/android/view/keyevent.html Para obter informações sobre a repetição de eventos de ação (mantendo a tecla Enter) etc.

Eu tinha um propósito semelhante. Eu queria resolver pressionar a tecla "Enter" no teclado (que eu queria personalizar) em um AutoCompleteTextView que estende o TextView. Eu tentei soluções diferentes de cima e elas pareciam funcionar. Mas tive alguns problemas quando mudei o tipo de entrada no meu dispositivo (Nexus 4 com AOKP ROM) do SwiftKey 3 (onde funcionou perfeitamente) para o teclado padrão do Android (onde, em vez de lidar com meu código do ouvinte, uma nova linha foi Digite depois de pressionar a tecla "Enter". Demorei um pouco para lidar com esse problema, mas não sei se funcionará em todas as circunstâncias, independentemente do tipo de entrada que você usa.

Então aqui está minha solução:

Defina o atributo de tipo de entrada do TextView no XML como "Texto":

android:inputType="text"

Personalize o rótulo da tecla "Enter" no teclado:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

Defina um OnEditorActionListener para o TextView:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

Espero que isso possa ajudar outras pessoas a evitar os problemas que tive, porque eles quase me deixaram louco.

No seu XML, adicione o atributo iMeoptions ao EditText

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

Em seguida, no seu código Java, adicione o OneditorActionListener ao mesmo EditText

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

Aqui está a explicação- as iMeOptions = ActionDone atribuirão "ActionDone" ao EnterKey. O EnterKey no teclado mudará de "Enter" para "Done". Portanto, quando a tecla ENTER é pressionada, ela acionará essa ação e, portanto, você o manuseará.

Você também pode fazer isso ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

Funciona muito bem para mim
Além disso, ocultar o teclado

funcionando perfeitamente

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

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

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

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

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

funcionando perfeitamente

Primeiro, você tem que definir EdittExt ouvir a tecla Press

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

Segundo, defina o evento na imprensa de teclas, por exemplo, evento para definir o texto do TextView:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

E, finalmente, não se esqueça de importar EdittExt, TextView, OnKeyListener, KeyEvent no topo:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

Xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

Isso deve funcionar

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

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

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

Isso funciona bem nos telefones LG Android. Previne ENTER e outros caracteres especiais a serem interpretados como caráter normal. Next ou Done o botão aparece automaticamente e ENTER funciona conforme o esperado.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

Aqui está uma função estática simples que você pode jogar em seu Utils ou Keyboards classe que executará o código quando o usuário atingir a tecla de retorno em um teclado de hardware ou software. É uma versão modificada da excelente resposta do @Earlcasper

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

InputType no campo de texto deve ser text para que o que o Commonsware disse para funcionar. Acabei de tentar tudo isso, sem inputType antes do julgamento e nada funcionou, o Enter continuou se registrando como Soft Enter. Depois inputType = text, tudo, incluindo o setimelabel, funcionou.

Exemplo : android:inputType="text"

   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

Digite este código no seu editor para que possa importar os módulos necessários.

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                || actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

Uma maneira confiável de responder a umu003Center> em um EdittExt está com um Textwatcher, uma LocalBroadcastManager, e a Receptor de radiodifusão. Você precisa adicionar o V4 Biblioteca de suporte Para usar o localbroadcastManager. Eu uso o tutorial em vogella.com: 7.3 "Eventos de transmissão local com o LocalBroadcastManager" por causa de seu exemplo completo de código conciso. Em OntextChanged antes da é o índice do fim da mudança antes da mudança>; menos inicial. Quando no Textwatcher, o tópico da interface do usuário está ocupado atualizando o EdittExt's Editable, por isso enviamos a intenção de acordar o BroadCastreceiver quando o thread da interface do usuário terminar de atualizar o EditText.

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

Adicione estes dependencendy e deve funcionar:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

Esta pergunta ainda não foi respondida com Butternife

Layout XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

Aplicativo java

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

Kotlin

editTextVar?.setOnKeyListener { v, keyCode, event ->
            if((event.action == KeyEvent.ACTION_DOWN)
                && (event.keyCode == KeyEvent.KEYCODE_ENTER)){
                //Do something, such as loadJob()
                loadJob()
                return@setOnKeyListener true
            }

            false
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top