Метод onBackPressed не работает должным образом

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

Теперь в настоящее время мне приходится нажимать кнопку «Назад» два раза, один раз, чтобы скрыть клавиатуру, а другой — для выполнения какой-либо задачи (например, сохранения данных в БД). Я не хочу нажимать кнопку «Назад» два раза.

пожалуйста, направьте меня или предложение

вот немного от onBackPressed()

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();

    hideKeypad();

    //saving EditText data to db.
}

кодовая форма hideKeypad()

private void hideKeypad() {
       InputMethodManager imm = (InputMethodManager) 
        getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(edittext1.getWindowToken(), 0);
}

person PSK    schedule 20.03.2013    source источник
comment
Вы пытались скрыть клавиатуру после того, как пользователь вводит то, что он вводит?   -  person adneal    schedule 20.03.2013
comment
нет, но как я могу судить, что пользователь закончил свой ввод @aneal   -  person PSK    schedule 20.03.2013
comment
Возможно, связано: stackoverflow.com/questions/3558385/   -  person adrianp    schedule 20.03.2013
comment
Вы можете проверить, что ваш метод onBackPressed() действительно выполняется (добавьте log.d или что-то еще) и не захвачен чем-то другим (например, программной клавиатурой).   -  person adrianp    schedule 20.03.2013
comment
Слушайте их, чтобы нажать клавишу возврата или ввода, в зависимости от того, что вы показываете.   -  person adneal    schedule 20.03.2013


Ответы (3)


Используйте этот метод, он аналогичен тому, что вы уже делали, но я его немного изменил. Зарегистрируйте прослушиватель вашего основного макета и передайте его объект в качестве параметра, чтобы при щелчке вне поля редактирования текста, т.е. Клавиатура основной раскладки исчезнет.

/** Close Keypad on touch.
 * @param view on which click happens. */

 public void closeKeyPad(View view)
    {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);    
    }
person Akhilesh Mani    schedule 20.03.2013
comment
Я пробовал .. это передал EditText методу, но он все равно не работает @Akhilesh Mani - person PSK; 20.03.2013
comment
EditText в моем приложении полноэкранный режим.. @Akhilesh Mani - person PSK; 20.03.2013
comment
@PSK хорошо, я думаю, что Mr.Me прав, в этом случае вы можете использовать EditorAction. - person Akhilesh Mani; 20.03.2013

Нажатие назад, чтобы закрыть клавиатуру, является стандартной функцией пользовательского интерфейса. Почему вы хотите изменить это?

Пользователи, которые привыкли использовать программную клавиатуру на устройствах Android, привыкли нажимать назад один раз, чтобы закрыть клавиатуру, а затем еще раз, чтобы вернуться в приложение.

Если вы заставите кнопку «Назад» двигаться назад в приложении, когда отображается клавиатура, это сделает навигацию отличной от стандартной навигации Android, и многих пользователей это может разочаровать.

Кроме того, ваш onBackPressed не вызывается, потому что при отображении клавиатуры запускается onBackPressed для клавиатуры — что, как мы все видели, — это то, что скрывает клавиатуру — и не onBackPressed для вашего приложения.

Ответ Mr.Me - это способ сделать это, если вы действительно хотите пойти по этому пути, но я бы не рекомендовал этого.

person Jamie - Fenrir Digital Ltd    schedule 20.03.2013

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

код для этого:

    edit.setOnEditorActionListener(
     new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH ||
        actionId == EditorInfo.IME_ACTION_DONE ||
        event.getAction() == KeyEvent.ACTION_DOWN &&
        event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
    if (!event.isShiftPressed()) {
       // the user is done typing.  finish the activity
       finish();
       return true; // consume.
    }                
}
return false; // pass on to other listeners. 
}
});
person Mr.Me    schedule 20.03.2013