Подтвердить что ты не робот

Показать/скрыть панель инструментов Android для замены фрагмента

У меня есть Activity с фрагментом. Скажем, фрагмент списка со списком вещей. Теперь я хочу, чтобы пользователь добавил вещь, поэтому я использую FragmentManager, чтобы заменить фрагмент списка фрагментом вставки, который имеет EditText. В EditText есть фокус, и курсор мигает. Но программная клавиатура не открывается. То же самое и наоборот: если пользователь ввел новую вещь и добавил ее в список, я заменил фрагмент вставки фрагментом списка. Но, хотя больше нет EditText, клавиатура не закрывается.

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

4b9b3361

Ответ 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, так как в любом случае необходимо обрабатывать регистр изменения ориентации. Похоже на излишний, и вы также получаете различные анимации перехода.