Показать/скрыть панель инструментов Android для замены фрагмента
У меня есть Activity с фрагментом. Скажем, фрагмент списка со списком вещей. Теперь я хочу, чтобы пользователь добавил вещь, поэтому я использую FragmentManager, чтобы заменить фрагмент списка фрагментом вставки, который имеет EditText. В EditText есть фокус, и курсор мигает. Но программная клавиатура не открывается.
То же самое и наоборот: если пользователь ввел новую вещь и добавил ее в список, я заменил фрагмент вставки фрагментом списка. Но, хотя больше нет EditText, клавиатура не закрывается.
Каков правильный способ реализации этого? Не могу поверить, что мне приходится показывать и скрывать клавиатуру вручную на всех переходах?!
Ответы
Ответ 1
Я хотел бы следить за вещами:
1. Расширить класс Fragment
2. Отменить onAttach()
и onDetach()
обратные вызовы
3. Внедрить демонстрацию и скрыть программный метод клавиатуры
пример кода:
class MyFragment extends Fragment {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//show keyboard when any fragment of this class has been attached
showSoftwareKeyboard(true);
}
@Override
public void onDetach() {
super.onDetach();
//hide keyboard when any fragment of this class has been detached
showSoftwareKeyboard(false);
}
protected void showSoftwareKeyboard(boolean showKeyboard){
final Activity activity = getActivity();
final InputMethodManager inputManager = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), showKeyboard ? InputMethodManager.SHOW_FORCED : InputMethodManager.HIDE_NOT_ALWAYS);
}
}
Ответ 2
Чтобы отобразить клавиатуру:
editText.requestFocus();
InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(editText, 0);
а затем, чтобы скрыть его:
InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Ответ 3
У меня такая же проблема с моим приложением, и, наконец, у нас есть 2 варианта, сначала создайте общую функцию и вызовите это во всех переходах или создайте глобальный переход, как это:
public static void RemoveAndReplaceFragment(FragmentManager fragmentManager, int FragmentContent, Fragment PlaceHolderFragment,Activity context){
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frgMainActivity))
.commit();
//Close keyBoard in transition
InputMethodManager inputManager = (InputMethodManager) context.getSystemService(
Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.animation_fade_in,R.anim.animation_fade_out);
fragmentTransaction.replace(R.id.frgMainActivity, new PlaceholderFragment_MainActivity_AcceptAndFollowTask()).commit();
}
}
Лучший способ захватить событие перехода, но мы не можем в этот момент... Скажите, если я вам помогу, удачи!
Ответ 4
Это будет работать точно:
private void hideKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
private void showKeyboard(){
EditText myEditText = (EditText) findViewById(R.id.myEditText);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
}
Ответ 5
Я предполагаю, что ваш ListView
крадет фокус вашего EditText
, попробуйте это и сообщите мне, если это поможет.
getListView().setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Ответ 6
Попробуйте это
InputMethodManager imgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
Ответ 7
Я согласен, я не мог поверить, что вам тоже нужно было скрыть клавиатуру.
Добавьте это в свой фрагмент onCreate, что вы не хотите, чтобы клавиатура не была:
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(mToolbar.getWindowToken(), 0);
измените mToolbar на любой вид в макете. В этом случае я использовал свою панель инструментов.
Добавьте это в фрагмент onCreate, чтобы вы отображали клавиатуру.
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
Ответ 8
вы можете использовать нижеприведенный код, чтобы скрыть мягкую клавиатуру.
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
Ответ 9
Один из способов - вызвать Activity.recreate
, так как в любом случае необходимо обрабатывать регистр изменения ориентации. Похоже на излишний, и вы также получаете различные анимации перехода.