2011-10-05 3 views
0

J'ai un problème avec un textview dans mon application. Lorsque l'application s'exécute pour la première fois, cela fonctionne parfaitement bien, mais quand je change de vue en utilisant setContentView, puis de nouveau en arrière, le clavier logiciel ne sera plus ouvert mais je pourrai sélectionner le texte.Android: Le clavier virtuel n'apparaîtra pas pour une vue de texte après un setContentView

Voici l'extrait de code lorsque je tente de revenir:

public void setToMain(String _word) 
    { 
     setContentView(R.layout.main); 
     mWordInput = (TextView) findViewById(R.id.wordInput); 
     mWordInput.setText(_word); 
    } 

Même si je ne l'appelle pas setText je reçois le problème.

+1

Pour autant que je sais que vous ne devriez pas utiliser setContentView plusieurs fois, voir http://stackoverflow.com/questions/6811989 –

+0

Merci pour l'aide. Y at-il une bonne source pour ces types de conseils de programmation Android? Je suis nouveau à la programmation Android et je ne sais pas ce que je devrais et ne devrais pas faire. – schlaegerz

Répondre

1

J'ai eu un problème similaire avec le clavier logiciel; bien que dans mon cas, il ne s'afficherait même pas sans changer de vue avec setContentView. Après quelques expériences, j'ai trouvé la solution qui fonctionne toujours pour moi. L'idée était d'intercepter l'affichage/la dissimulation du clavier logiciel pour tout descendant EditText. Pour cela, j'ai remplacé onWindowFocusChanged de l'activité.

L'astuce était de cacher le clavier quand il n'est plus nécessaire.

Comme vous pouvez le voir, j'ai utilisé toggleSoftInput avec SHOW_IMPLICIT à la place de toute constante HIDE. Dans ce cas, IMEManager ne conserverait le clavier visible que si la vue focalisée l'exige sinon il sera caché.

private boolean softInputActive; 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 

    super.onWindowFocusChanged(hasFocus); 

    InputMethodManager IMEManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 

    View focusedView = getCurrentFocus(); 

    // Find the primitive focused view (not ViewGroup) 
    while (focusedView instanceof ViewGroup) { 
     focusedView = ((ViewGroup) focusedView).getFocusedChild(); 
    } 


    if (hasFocus) { 

     if (focusedView instanceof EditText && focusedView.isEnabled() 
       && !IMEManager.isActive(focusedView)) { 
      IMEManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 
      softInputActive = true; 
     } 
    } else if (softInputActive) { 
     if (focusedView != null && IMEManager.isActive()) { 
      IMEManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); 
     } 
     softInputActive = false; 
    } 

} 
0

dans le fichier Manifest vous pouvez utiliser dans votre déclaration d'activité

android:windowSoftInputMode="stateVisible|adjustPan" 
Questions connexes