web-dev-qa-db-fra.com

Comment détecter un redimensionnement de mise en page?

Dianne Hackborn a mentionné dans quelques discussions que vous pouvez détecter quand une mise en page a été redimensionnée, par exemple, lorsque le clavier virtuel s'ouvre ou se ferme. Un tel fil est celui-ci ... http://groups.google.com/group/Android-developers/browse_thread/thread/d318901586313204/2b2c2c7d4bb04e1b

Cependant, je n'ai pas compris sa réponse: "Par votre hiérarchie de vues étant redimensionnée avec tous les parcours et rappels de mise en page correspondants."

Quelqu'un a-t-il une description supplémentaire ou quelques exemples de la façon de détecter cela? À quels rappels puis-je me connecter pour détecter cela?

Merci

34
cottonBallPaws

Remplacez onSizeChanged dans votre Voir !

56
dacwe

Une façon est View . addOnLayoutChangeListener . Il n'est pas nécessaire de sous-classer la vue dans ce cas. Mais vous avez besoin de l'API niveau 11. Et le calcul correct de la taille à partir des limites (non documenté dans l'API) peut parfois être un piège. Voici un exemple correct:

view.addOnLayoutChangeListener( new View.OnLayoutChangeListener()
{
    public void onLayoutChange( View v,
      int left,    int top,    int right,    int bottom,
      int leftWas, int topWas, int rightWas, int bottomWas )
    {
        int widthWas = rightWas - leftWas; // Right exclusive, left inclusive
        if( v.getWidth() != widthWas )
        {
            // Width has changed
        }
        int heightWas = bottomWas - topWas; // Bottom exclusive, top inclusive
        if( v.getHeight() != heightWas )
        {
            // Height has changed
        }
    }
});

Une autre façon (comme le répond Dacwe) est de sous-classer votre vue et de remplacer onSizeChanged .

56
Michael Allan

Ma solution est d'ajouter une petite vue muette invisible à la fin de la mise en page/fragment (ou de l'ajouter en arrière-plan), ainsi tout changement de taille de la mise en page déclenchera l'événement de changement de mise en page pour cette vue qui pourrait être rattrapée par OnLayoutChangeListener:

Exemple d'ajout de la vue muette à la fin de la mise en page:

 <View 
    Android:id="@+id/theDumbViewId"
    Android:layout_width="1dp"
    Android:layout_height="1dp"
     />

Écoutez l'événement:

    View dumbView = mainView.findViewById(R.id.theDumbViewId);
    dumbView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            // Your code about size changed
        }
    });
4
Tony

Merci à https://stackoverflow.com/users/2402790/michael-allan c'est le moyen simple et efficace si vous ne voulez pas remplacer toutes vos vues. Comme Api a évolué, je suggère plutôt ce copier-coller:

    String TAG="toto";
    ///and last listen for size changed
    YourView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v,
                                   int left, int top, int right, int bottom,
                                   int oldLeft, int oldTop, int oldRight, int oldBottom) {

           boolean widthChanged=((right-left)!=(oldRight-oldLeft));
            if( widthChanged )
            {
                // width has changed
                Log.e(TAG,"Width has changed new width is "+(right-left)+"px");
            }
            boolean heightChanged=((bottom-top)!=(oldBottom-oldTop));
            if( heightChanged)
            {
                // height has changed
                Log.e(TAG,"height has changed new height is "+(bottom-top)+"px");
            }
        }
    });