Я не могу скрыть виртуальную клавиатуру на Android
Я работаю с фрагментами и вложенными фрагментами внутри фрагментов, используя библиотеку поддержки.
У меня есть сценарий, где я добавляю новый фрагмент (который содержит EditText) из существующего фрагмента. Когда пользователь нажимает на EditText, отображается виртуальная клавиатура. Но когда клавиатура открыта, пользователь может нажать кнопку "Домой" на панели действий, которая удаляет фрагмент из стека, но клавиатура все еще остается открытой. Я не могу принудительно закрыть клавиатуру, я попробовал все фрагменты кода. Учитывая описанный сценарий, кто-нибудь может подсказать мне, как я могу решить эту проблему?
РЕДАКТИРОВАТЬ: я сделал функцию обратного вызова, которую я вызываю из фрагментов onDestroy. MainActivity, который содержит все фрагменты, реализует этот обратный вызов:
@Override
public void onHideSoftKeyboard(EditText editText) {
// HIDE SOFT KEYBOARD HERE
final InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Toast.makeText(this,"KEYBOARD HIDDEN",Toast.LENGTH_LONG).show();
}
Я получаю сообщение Toast, и фрагмент уничтожается на кнопке "Назад" (кнопка "Назад" ActionBar), только клавиатура все еще присутствует.
@Override
public void onDestroy() {
hideSoftKeyboard.onHideSoftKeyboard(editTextComment);
super.onDestroy();
}
4 ответа
Попробуйте заставить клавиатуру с этим:
InputMethodManager imm = (InputMethodManager)getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Вам также может понравиться это:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Если вы хотите скрыть, когда пользователь нажимает кнопку "Вверх", попробуйте вот так в вашем методе onOptionsItemSelected:
case android.R.id.home:
// count the active fragment
if(getSupportFragmentManager().getStackBackEntryCount() > 0) {
// hide soft method as above
InputMethodManager mImm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
mImm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
// do the pop backstack
getSupportFragmentManager().popBackStack();
} else {
// some stuff like finish the activity
}
return true;
// other items...
Вы можете сделать то же самое с кнопкой "Назад", когда используете метод (override) onBackPressed.
Вы можете использовать следующий код.
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
Я исправил эту проблему следующим образом. Во-первых, если вы хотите автоматически выдвигать клавиатуру при запуске упражнения, напишите приведенный ниже код в методе onCreate.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Затем, если вы хотите закрыть клавиатуру, используйте следующее.
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
Я решил эту проблему с помощью следующего решения
Вам необходимо расширить каждый свой фрагмент из BaseFragment, как показано ниже:
public class BaseFragment extends Fragment {
@Override
public void onDestroyView() {
hideKeyboard(getView());
super.onDestroyView();
}
public void hideKeyboard(View view) {
if(view != null) {
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
И все фрагменты, которые вы хотите скрыть, когда клавиатура будет закрыта, должны расширять BaseFragment:
public class EditTextFragment extends BaseFragment {
...
}
В качестве бонуса в каждом расширенном фрагменте вы можете использовать hideKeyboard(View view)
способ скрыть клавиатуру, когда вы хотите в любом месте вашего фрагмента