2012-01-05 20 views
12

Tengo FragmentActivity que inicialmente muestra un fragmento con algunos botones. Al hacer clic en uno de los botones, FragmentActivity muestra un nuevo fragmento con algunos campos editText. Parece que no puedo mostrar el teclado de entrada suave cuando aparece mi nuevo fragmento con los campos editText.SoftKeyboard no se muestra para un Fragment recién visualizado

El uso del modo windowSoftInput en el manifiesto está desactivado ya que muestra el teclado de inmediato.

android:windowSoftInputMode="stateUnchanged" 

He intentado usar

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

en vano. Así es como puedo mostrar la nueva fragmento de mi Actividad:

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; 

...

También he intentado llamar setSoftInputMode desde dentro onCreate del fragmento y que no ha funcionado tan bien. Pensando que era un problema de tiempo, lo probé con handler.postDelayed y eso tampoco funcionó. Se veía así:

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

Cualquier ayuda será apreciada. Gracias.

+0

Sé que esto es viejo, pero para referencia futura : Creo que Window.setSoftInputMode se debe hacer una vez en Activity onCreate, ya que más adelante no parece tener efecto. Durante la operación, InputMethodManager se debe usar para cambios. – ProjectJourneyman

Respuesta

19

En su onResume usted puede hacer esto:

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

¡Gracias! que funcionó –

+0

Sea bienvenido Nelson: D – jegumi

+4

no funciona para mí. – feresr

4

Tuve un problema muy similar. El fragmento A llama al fragmento B, donde el fragmento B (Diseño con TABS) tiene EditText. El teclado no aparecería para este cuadro Editar texto a menos que haga clic en otra cosa.

He intentado la solución aquí, y en muchas otras soluciones stackoverflow. MUCHOS. El único que funcionó para mí fue borrar el foco en EditText cuando se hizo clic en EditText. En OnFocusChangeListener, pude forzar que el teclado se abriera y se cerrara.

Este problema solo ocurrió para mí en Android 2.34 dispositivos y no 2.2 o 3.0. Emulator tampoco tuvo problemas. Manifest solo tenía adjustResize en él.

Así que aquí es una solución que trabajó para mí (esperemos que alguien encuentra este útil):

En 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();        
     }  
    });  
+0

Conocía esta pequeña peculiaridad, pero lo olvidé por completo. Gracias por publicarlo Me ayudó un montón :-) – George

+0

Muchas gracias, también probé de muchas maneras, esta es la única solución. – thanhbinh84

Cuestiones relacionadas