Android - Identificador de "Entrar" em um EditText
-
18-09-2019 - |
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).
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
}