2010-08-25 6 views
20

Voici le dilemme: Je montre un écran avec 3 champs de saisie et 2 boutons à l'intérieur d'un onglet (il y a 3 onglets au total, et ils sont au bas de l'écran). les 2 boutons sont placés en bas à gauche et à droite de l'écran, juste au-dessus des onglets. Lorsque je clique sur un champ de saisie, les onglets et les boutons sont tous poussés vers le haut sur le clavier.Android: comment puis-je savoir si le clavier virtuel est affiché ou non?

Je désire seulement pousser les boutons vers le haut, et laisser les onglets là où ils se trouvent à l'origine, en bas. Je pense à régler la visibilité des onglets à GONE une fois que je détermine que le clavier logiciel est visible, et la visibilité de VISIBLE une fois que le clavier virtuel est parti.

Y at-il une sorte d'écouteur pour le clavier logiciel, ou peut-être le champ de saisie? peut-être une utilisation délicate de OnFocusChangeListener pour le texte d'édition? Comment puis-je déterminer si le clavier est visible ou non?

+0

Check this out: http://stackoverflow.com/questions/4745988/how-do-i-detect-if-software-keyboard-is-visible-on-android-device/31090451#31090451 Fonctionne bien pour moi. –

+0

Copie possible de [Comment vérifier la visibilité du clavier logiciel dans Android?] (Http: // stackoverflow.com/questions/2150078/how-to-check-visibilité-du-logiciel-clavier-dans-android) – afathman

Répondre

5

Déterminer si le clavier est affiché n'est pas possible apparemment.

Vous souhaiterez peut-être tout désactiver avec la balise windowSoftInputMode xml dans votre manifeste: http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode. Ou vous pouvez jeter un oeil sur la façon de supprimer le focus pour masquer le clavier: Hide soft keyboard on activity without any keyboard operations.

Aucun ne résoudra exactement votre problème. Je me souviens avoir lu un article de blog conseillant fortement de ne pas utiliser les onglets en bas, plutôt que le haut de l'écran, pour des raisons de clarté de l'interface. Je vous recommande de faire un suivi à ce sujet.

+1

Est-il encore impossible de déterminer de façon fiable si le clavier logiciel est affiché? Cinq années se sont écoulées depuis ... –

0

Cela pourrait aider http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html

https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/java/src/com/android/inputmethod/latin

Le code du clavier est ici, je rassemblés de par un peu, mais renoncer, je ne vois aucun Diffusions être envoyé qui serait de toute utilisation, au moins ici. Peut-être que vous pouvez aller trouver le code de niveau inférieur dans le repo et trouver une intention utile envoyée. Le premier linke pourrait vous dire quand il devient visible, mais je ne suis pas sûr de savoir quand il deviendra invisible.

-5

Dans ma dernière application que j'ai eu quelques problèmes dans l'affichage du clavier doux, je l'ai utilisé le code suivant dans mon fichier Manifest:

<activity android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation" android:name=".rate.Calculator"/>

1

Pour autant que je sache, vous ne peut pas. Toutefois, vous pouvez surveiller les changements de taille de votre mise en page et, étant donné que le clavier est la principale cause des redimensionnements, vous pouvez supposer que le clavier est affiché ou non.

Voici un exemple de code pour surveiller les changements de taille d'une mise en page. Utilisez simplement cette disposition en tant que parent de votre mise en page d'origine et utilisez son écouteur. Si la hauteur a diminué, vous pouvez supposer que le clavier est affiché, et s'il a été augmenté, vous pouvez supposer qu'il s'est fermé.

public class LayoutSizeChangedSensorFrameLayout extends FrameLayout { 
    public enum SizeChange { 
     HEIGHT_INCREASED, HEIGHT_DECREASED, WIDTH_INCREASED, WIDTH_DECREASED 
    } 

    public interface OnLayoutSizeChangedListener { 
     void onSizeChanged(EnumSet<SizeChange> direction); 
    } 

    private OnLayoutSizeChangedListener mLayoutSizeChangeListener; 

    public LayoutSizeChangedSensorFrameLayout(final Context context) { 
     super(context); 
    } 

    public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attributeSet) { 
     super(context, attributeSet); 
    } 

    public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attrs, final int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     if (mLayoutSizeChangeListener != null) { 
      final EnumSet<SizeChange> result = EnumSet.noneOf(SizeChange.class); 
      if (oldh > h) 
       result.add(SizeChange.HEIGHT_DECREASED); 
      else if (oldh < h) 
       result.add(SizeChange.HEIGHT_INCREASED); 
      if (oldw > w) 
       result.add(SizeChange.WIDTH_DECREASED); 
      else if (oldw < w) 
       result.add(SizeChange.WIDTH_INCREASED); 
      if (!result.isEmpty()) 
       mLayoutSizeChangeListener.onSizeChanged(result); 
     } 
    } 

    public void setOnLayoutSizeChangedListener(final OnLayoutSizeChangedListener layoutSizeChangeListener) { 
     this.mLayoutSizeChangeListener = layoutSizeChangeListener; 
    } 

    public OnLayoutSizeChangedListener getOnLayoutSizeChangeListener() { 
     return mLayoutSizeChangeListener; 
    } 
} 
Questions connexes