Android-дескриптор "Enter" в EditText



Мне интересно, есть ли способ справиться с пользователем, нажав введите при вводе в EditText, что-то вроде события onSubmit HTML.



также интересно, есть ли способ манипулировать виртуальной клавиатурой таким образом, что кнопка "готово" помечается чем-то другим (например, "Go") и выполняет определенное действие при нажатии (опять же, как onSubmit).

1066   20  

20 ответов:

мне интересно, есть ли способ обрабатывать пользователя нажатием введите пока набрав в EditText, что-то вроде событие onSubmit HTML.

да.

также интересно, есть ли способ управление виртуальной клавиатурой в таким образом, кнопка " готово помечено что-то другое (например "Go") и выполняет определенное действие при нажатии (опять же, как onSubmit).

также да.

вы хотите посмотреть android:imeActionId и android:imeOptions атрибуты, плюс setOnEditorActionListener() метод, все от TextView.

для изменения текста кнопки "Готово" на пользовательскую строку используйте:

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

вот что вы делаете. Он также скрыт в примере кода разработчика Android "Bluetooth-чат". Замените жирные части, которые говорят "пример" С вашими собственными переменными и методами.

во-первых, импортировать то, что вам нужно в основной деятельности, где вы хотите кнопку возврата, чтобы сделать что-то особенное:

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

теперь сделайте переменную типа TextView.OnEditorActionListener для вашего ключа возврата (здесь я использую exampleListener);

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

затем вам нужно сказать слушателю две вещи о том, что делать, когда кнопка возврата нажата. Он должен знать, о каком EditText мы говорим (здесь я использую exampleView), и тогда он должен знать, что делать, когда нажата клавиша Enter (здесь example_confirm ()). Если это последний или единственный EditText в вашей деятельности, он должен делать то же самое, что и метод onClick для вашего Submit (или OK, Подтвердите, отправьте, сохраните и т. д.).

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

наконец, установите прослушиватель (скорее всего, в вашем методе onCreate);

exampleView.setOnEditorActionListener(exampleListener);
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;
    }
});

аппаратные клавиатуры всегда дают события ввода, но программные клавиатуры возвращают различные идентификаторы действий и нули в однолинейных текстах редактирования. Этот код отвечает каждый раз, когда пользователь нажимает enter в EditText, что этот прослушиватель был установлен, независимо от типа EditText или клавиатуры.

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

внешний вид по умолчанию клавиши enter в singleLine=false дает изогнутую стрелку enter клавиатуры. Когда singleLine=true в последнем EditText ключ говорит DONE, а на EditTexts раньше это он говорит дальше. По умолчанию это поведение соответствует всем эмуляторам vanilla, android и google. Атрибут scrollHorizontal не имеет никакого значения. Нулевой тест важен, потому что ответ телефонов на мягкие вводы оставлен изготовителю и даже в эмуляторах, эмуляторы уровня 16 ванили отвечают на длинные мягкие вводы в многострочных и scrollHorizontal EditTexts с actionId NEXT и null для события.

Я знаю, что это год, но я только что обнаружил, что это прекрасно работает для EditText.

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

Он предотвращает все, кроме текста и пространства. Я не мог tab, "return" ("\n") или что-то еще.

Так же, как добавление к ответу чада (который работал почти идеально для меня), я обнаружил, что мне нужно добавить проверку типа действия KeyEvent, чтобы предотвратить выполнение моего кода дважды (один раз на key-up и один раз на Key-down event).

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

см.http://developer.android.com/reference/android/view/KeyEvent.html для получения информации о повторяющихся событиях действий (удержание клавиши enter) и т. д.

у меня была похожая цель. Я хотел разрешить нажатие клавиши "Enter" на клавиатуре (которую я хотел настроить) в AutoCompleteTextView, который расширяет TextView. Я пробовал разные решения сверху, и они, казалось, работали. Но у меня возникли некоторые проблемы, когда я переключил тип ввода на своем устройстве (Nexus 4 с AOKP ROM) с SwiftKey 3 (где он отлично работал) на стандартную клавиатуру Android (где вместо обработки моего кода от слушателя была введена новая строка после нажатия клавиши" Enter". Мне потребовалось некоторое время, чтобы справиться с этой проблемой, но я не знаю, будет ли она работать при любых обстоятельствах, независимо от того, какой тип ввода вы используете.

Так вот мое решение:

установите атрибут типа ввода TextView в xml на "text":

android:inputType="text"

настройка метки клавиши "Enter" на клавиатуре:

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

установите OnEditorActionListener в TextView:

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

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

Я надеюсь, что это может помочь другие, чтобы избежать проблем, которые у меня были, потому что они почти сводили меня с ума.

эта страница точно описывает, как это сделать.

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

установить android: imeOptions тогда вы просто проверить actionId в onEditorAction. Так что если вы установите imeOptions к actionDone' затем вы должны проверить для 'ID действий == EditorInfo.IME_ACTION_DONE ' в onEditorAction. Кроме того, не забудьте установить android:inputType.

вот EditText из пример связан выше:

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

вы также можете установить это программно с помощью setImeOptions (int)

в xml добавьте атрибут imeOptions в editText

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

затем в коде Java добавьте OnEditorActionListener в тот же 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;
        }
    });

вот вам и объяснение- В imeOptions=actionDone будет назначать "actionDone" на клавишу Ввод. Клавишу Ввод на клавиатуре будет меняться от "входа" до "Сделано". Поэтому, когда клавиша Enter нажата, она вызовет это действие, и, таким образом, вы справитесь с этим.

вы также можете сделать это..

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

работает очень хорошо для меня
Кроме того, скрыть клавиатуру

во-первых, вы должны установить EditText слушать нажатие клавиши

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

}

во-вторых, определите событие при нажатии клавиши, например, событие для установки текста 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;   

}

и, наконец, не забудьте импортировать EditText, TextView, OnKeyListener, KeyEvent сверху:

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

работает отлично

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

        }
    });
}

}

работает отлично

это прекрасно работает на телефонах LG Android. Это мешает ENTER и другие специальные символы, которые будут интерпретироваться как обычный символ. Next или Done кнопка появляется автоматически и ENTER работает, как ожидалось.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

Это должно работать

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

надежный способ ответить на в EditText - это TextWatcher, a LocalBroadcastManager и BroadcastReceiver. Вам нужно добавить библиотека поддержки v4 для использования LocalBroadcastManager. Я использую учебник в vogella.com: 7.3 "локальные широковещательные события с LocalBroadcastManager" из-за его полного краткого примера кода. В onTextChanged до и индекс конец перемен до изменения>;минус. Когда в TextWatcher поток пользовательского интерфейса занят обновлением редактируемого editText, поэтому мы отправляем намерение разбудить BroadcastReceiver, когда поток пользовательского интерфейса завершает обновление 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

InputType на текстовом поле должен быть "текст" для того, что CommonsWare сказал, чтобы работать. Просто попробовал все это, нет inputType до суда и ничего не работало, Enter продолжал регистрироваться как soft enter. После inputType = text Все, включая setImeLabel, работало.

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

ответ Джареда Лоу работает как шарм для меня.

просто добавил Эти depencendy:

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

вот простая статическая функция, которую вы можете бросить в свой Utils или Keyboards класс, который будет выполнять код, когда пользователь нажимает клавишу ввода на аппаратной или программной клавиатуры. Это модифицированная версия отличного ответа @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;
        }
    };
}

Comments

    Ничего не найдено.