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

SoftKeyboard не отображается для вновь отображаемого фрагмента

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

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

 android:windowSoftInputMode="stateUnchanged"

Я пробовал использовать

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

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

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);

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

4b9b3361

Ответ 1

В вашем 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);

Ответ 2

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

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

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

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

В 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();                             
        }       
    });