SoftKeyboard не отображается для вновь отображаемого фрагмента - PullRequest
12 голосов
/ 06 января 2012

У меня есть FragmentActivity, которое изначально отображает фрагмент с несколькими кнопками на нем.Когда вы нажимаете одну из кнопок, FragmentActivity отображает новый фрагмент с некоторыми полями editText.Я не могу заставить мягкую клавиатуру ввода отображаться, когда отображается мой новый фрагмент с полями editText.

Использование режима windowSoftInput в манифесте отключено, поскольку сразу отображается клавиатура.

 android:windowSoftInputMode="stateUnchanged"

Я пытался использовать

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

но безрезультатно.Вот как я отображаю новый фрагмент из моей Деятельности:

public void clickHandler(View view) {
        switch (view.getId()) {
        case R.id.login:
            loginFragment = new LoginFragment();
            FragmentTransaction transaction = getSupportFragmentManager()
                    .beginTransaction();

            transaction.replace(R.id.fragment_container, loginFragment);
            transaction.addToBackStack(null); 
            transaction.commit();
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);  
            break;

...

Я также попытался вызвать setSoftInputMode из onCreate фрагмента, но это также не сработало.Думая, что это проблема синхронизации, я попробовал это с handler.postDelayed, и это тоже не сработало.Выглядело это так:

onResume...    
Handler handler = new Handler();
            Runnable runnable = new Runnable() {

                @Override
                public void run() {
                    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);                
                }
            };

            handler.postDelayed(runnable, 1000);

Любая помощь будет оценена.Благодарю.

Ответы [ 2 ]

21 голосов
/ 07 января 2012

На вашем onResume вы можете сделать это:

EditText someEditText = (EditText)getActivity().findViewById(R.id.someEditText);
someEditText.requestFocus(); 
InputMethodManager mgr =      (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(someEditText, InputMethodManager.SHOW_IMPLICIT);
5 голосов
/ 02 августа 2012

У меня была очень похожая проблема.Фрагмент A вызывает фрагмент B, где фрагмент B (Layout with TABS) содержит EditText.Клавиатура не будет подходить для этого поля EditText, если я не нажму на что-нибудь еще.

Я попробовал решение здесь и на многих других решениях для работы со стеком. МНОГИЕ. Единственное, что сработало для меня, это очистить фокус на EditText при нажатии EditText.В OnFocusChangeListener мне удалось принудительно открыть и закрыть клавиатуру.

Эта проблема возникла только у меня на устройствах Android 2.34, а не на 2.2 или 3.0.У эмулятора тоже не было проблем.В манифесте было только AdjustResize.

Итак, вот решение, которое сработало для меня (надеюсь, кто-то еще найдет это полезным):

В onCreateView (...)

    //
    //Inflate Your Layout Here
    //

    //set on focus to force keyboard
    editText.setOnFocusChangeListener(new OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus) 
        {
            Log.d(TAG,"On Foucs. Has Focus = " + hasFocus);

            if (hasFocus)
            {
                 //open keyboard
                ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(v,
                        InputMethodManager.SHOW_FORCED);
            }
            else
            { 
                //close keyboard
                ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(
                        v.getWindowToken(), 0);
            }                               
        }
    });

    //Set on click listener to clear focus
    editText.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View clickedView) 
        {                           
            clickedView.clearFocus();
            clickedView.requestFocus();                             
        }       
    });    
...