Как закрыть активность с помощью клавиатуры программного обеспечения после нажатия BACK?
У меня есть Activity, где я хочу, чтобы клавиатура программного обеспечения была анонимной. Как закрыть активность после нажатия BACK, когда клавиатура открыта? Теперь я должен дважды нажать BACK, сначала для закрытия клавиатуры, а затем для завершения Activity.
Ответы
Ответ 1
Как уже упоминалось, onKeyPreIme можно использовать, чтобы поймать кнопку "Назад", но это необходимо переопределить в текстовом представлении, а не в действии.
Здесь полное решение:
Сначала новый класс, полученный из EditText, переопределяет onKeyPreIme и вызывает интерфейс обратного вызова:
// EditTextWithBackButton class
public class EditTextWithBackButton extends EditText
{
public interface IOnBackButtonListener
{
boolean OnEditTextBackButton();
}
public EditTextWithBackButton(Context context)
{
super(context);
}
public EditTextWithBackButton(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public void setOnBackButtonListener(IOnBackButtonListener l)
{
_listener = l;
}
IOnBackButtonListener _listener;
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event)
{
if (event.getAction()==KeyEvent.ACTION_UP && keyCode==KeyEvent.KEYCODE_BACK)
{
if (_listener!=null && _listener.OnEditTextBackButton())
return false;
}
return super.onKeyPreIme(keyCode, event); //To change body of overridden methods use File | Settings | File Templates.
}
}
Затем обновите макет:
<com.yournamespace.whatever.EditTextWithBackButton
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textField"
/>
Затем обновите свою активность внутри OnCreate после setContentView:
((EditTextWithBackButton) findViewById(R.id.textField)).setOnBackButtonListener(new EditTextWithBackButton.IOnBackButtonListener()
{
@Override
public boolean OnEditTextBackButton()
{
finish();
return true;
}
});
Ответ 2
Используйте метод onKeyPreIme (int keyCode, KeyEvent) и проверьте событие KeyEvent.KEYCODE_BACK. Это очень просто, без каких-либо причудливых кодировок.
Ответ 3
Я не верю, что вам понадобится слушатель, setOnBackButtonListener, как это было сначала предложено.
У меня это работает, используя getContext():
public class EditedText extends EditText {
@Override
public boolean onKeyPreIme (int keyCode, KeyEvent event){
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
Activity activity = (Activity) getContext();
activity.finish();
return true;
}
return super.onKeyPreIme(keyCode, event);
}
}
Обратите внимание, что поскольку событие было обработано, я возвращаю true, а не false, как это было сначала предложено в предыдущих ответах.
Ответ 4
Вы можете использовать следующие
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
finish();
return true;
}
return super.onKeyUp(keyCode, event);
}
Ответ 5
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
но скажите, что вам нужно приложить еще одно усилие для обнаружения того, что клавиатура открыта, а не используется флагом использования, который может быть использован для принятия решения о возврате или завершении операции.
Ответ 6
установите для параметра "Редактирование текста" значение "OnEditorActionListener" для того, что вы предоставляете мягкую клавиатуру, как показано ниже,
editText.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (event != null
&& (event.getKeyCode() == KeyEvent.KEYCODE_BACK)) {
finish();
}
return false;
}
});