web-dev-qa-db-fra.com

Comment obtenir la taille visible sur une activité?

Comment connaître la taille visible de mon activité? 

J'essaie d'obtenir la taille réelle de l'activité,
Pas la hauteur et la largeur de getHeight() et getWidth(),
qui me donne la taille de l'écran.

29
Tsimmi

J'ai trouvé un moyen de connaître la hauteur exacte de mon activité: si vous avez une vue remplissant tout l'écran disponible derrière la barre de titre et la barre des tâches, utilisez simplement getBottom() pour obtenir la hauteur réelle de cette activité.

13
Tsimmi

Je pense que vous voudrez regarder Activity.getWindow() et Window.getDecorView() et en obtenir la largeur/hauteur.

38
Dave

J'ai fait cela en utilisant ma mise en page racine, le problème est que vous ne pouvez pas obtenir cette information (largeur et hauteur) dans vos méthodes onCreate/onStart/onResume quand elles s'exécutent pour la première fois.

À tout moment, la taille peut être récupérée à partir de votre mise en page racine (LinearLayout/FrameLayout/TableLayout/etc), dans mon cas, j'utilisais FrameLayout:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root);
Log.d(TAG, "width " + f.getMeasuredWidth() );
Log.d(TAG, "height " + f.getMeasuredHeight() );

ou:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root);
Log.d(TAG, "width " + f.getRight() );
Log.d(TAG, "height " + f.getBottom() );

Edité à partir d'ici --------------------------------------------------- ---------

J'ai trouvé un moyen d'obtenir cette information sur la méthode onCreted, mais seulement si vous avez plus d'une activité. Sur mon cas, j'ai une activité principale qui appelle une deuxième activité. 

Sur main_activity avant d'appeler la second_activity, par un nouvel Itent, je peux ajouter des informations supplémentaires pour la second_activity. Voici le code dont vous avez besoin pour la première activité:

Intent i = new Intent(this, SecondActivity.class);
i.putExtra("width", f.getMeasuredWidth());
i.putExtra("height", f.getMeasuredHeight());
startActivity(i);

Après cela lors de votre deuxième activité, vous pouvez récupérer ces informations sur la méthode onCreate de votre deuxième activité:

int width = getIntent().getExtras().getInt("width");
int height = getIntent().getExtras().getInt("height");
6
Derzu

J'aime plus les réponses qui font gagner du temps:

myActivity.getWindow().getDecorView().getHeight();
myActivity.getWindow().getDecorView().getWidth();
3
Zon

Il existe un moyen simple d’obtenir une taille de vue correcte à l’aide de la fonction getDefaultSize. Dans le cas d'une vue couvrant toute l'activité, vous pouvez utiliser l'approche suivante pour obtenir les dimensions de région client d'activité:

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    int viewWidth = getDefaultSize(getWidth(), widthMeasureSpec); 
    int viewHeight = getDefaultSize(getHeight(), heightMeasureSpec);
    ...
}

Pour que View s’étende sur toute l’activité:

MyView testView = new MyView(this);
LinearLayout testViewGroup = new LinearLayout(this);
testView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                          LayoutParams.FILL_PARENT);
testViewGroup.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                               LayoutParams.FILL_PARENT);
testViewGroup.addView(testView);
setContentView(testViewGroup);
3
Weaknespase

Si vous utilisez DataBinding (ce que vous devriez être), vous pouvez appeler binding.getRoot().getHeight()binding est votre ViewDataBinding créée avec DataBindingUtil.setContentView() ou une autre méthode DataBindingUtil. Vous devrez attendre que la disposition ait la taille, ce que vous pouvez faire comme ceci:

binding.getRoot().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        binding.getRoot().getViewTreeObserver().removeOnGlobalLayoutListener(this);

        int height = binding.getRoot().getHeight();
    }
});

Notez que vous devez supprimer OnGlobalLayoutListener, sinon il sera exécuté à chaque fois que quelque chose change dans votre mise en page.

2
LukeWaggoner

Obtenez le summum de l'activité:

public static int getActivityHeight(Activity activity)
{
   return activity.findViewById(Android.R.id.content).getHeight();
}

Obtenez la largeur de l'activité

public static int getActivityWidth(Activity activity)
{
    return activity.findViewById(Android.R.id.content).getWidth();
}
1
Hans

Vous obtiendrez la hauteur et la largeur à 0 aux méthodes onCreate ()/onStart ()/onResume (). Si la taille actuelle n’est pas encore définie, il est préférable d’utiliser l’observateur dans l’une de ces méthodes et de faire ce que vous voulez lorsque vous obtenez la taille actuelle.

constraint_layout est un élément racine de mise en page dans le code ci-dessous:

ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraint_layout);
constraintLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout()  {
        constraintLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int width = constraintLayout.getWidth();
        int height = constraintLayout.getHeight();
        doSmthMethod(width, height);
    }
});
0
Serg.Stankov