Как получить видимый размер на активность? - PullRequest
30 голосов
/ 17 июня 2010

Как я могу узнать видимый размер моей деятельности?

Я пытаюсь получить реальный размер действия,
, а не высоту и ширину из getHeight() и getWidth(),
, что дает мне полный размер экрана.

Ответы [ 8 ]

39 голосов
/ 17 июня 2010

I думаю вы захотите посмотреть на Activity.getWindow() и Window.getDecorView() и получить ширину / высоту этого.

13 голосов
/ 18 июня 2010

Я нашел способ узнать точную высоту моей активности: если у вас есть представление, заполняющее весь доступный экран за строкой заголовка и панелью задач, просто используйте getBottom(), чтобы получить реальную высоту этой активности .

6 голосов
/ 07 февраля 2012

Я сделал это, используя мой корневой макет, проблема в том, что вы не можете получить эту информацию (ширину и высоту) в ваших методах onCreate / onStart / onResume, когда они запускаются в первый раз.

В любой момент после этого размер может быть получен из вашего корневого макета (LinearLayout / FrameLayout / TableLayout / и т. Д.), В моем случае я использовал FrameLayout:

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

или:

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

Отредактировано отсюда --------------------------------------------------------

Я нашел способ получить эту информацию о методе onCreted, но только если вы выполняете более одного действия.В моем случае основной вид деятельности называется вторым.

На main_activity перед вызовом second_activity новым Itent я могу добавить дополнительную информацию для second_activity.Вот код, который вам нужен для первого занятия:

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

После этого для второго занятия вы можете получить эту информацию о методе onCreate вашего второго занятия, выполнив следующее:

int width = getIntent().getExtras().getInt("width");
int height = getIntent().getExtras().getInt("height");
3 голосов
/ 28 декабря 2017

Мне больше нравятся экономящие время ответы:

myActivity.getWindow().getDecorView().getHeight();
myActivity.getWindow().getDecorView().getWidth();
3 голосов
/ 30 июня 2016

Если вы используете DataBinding (что и должно быть), вы можете вызвать binding.getRoot().getHeight(), где binding - это ваш ViewDataBinding, созданный с помощью DataBindingUtil.setContentView() или другой такой DataBindingUtil метод.Вам нужно подождать, пока размер макета не будет, что вы можете сделать следующим образом:

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

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

Обратите внимание, что вам нужно удалить OnGlobalLayoutListener, иначе он будет запускаться каждый раз, когда что-то меняется в вашемрасположение.

3 голосов
/ 02 декабря 2012

Существует простой способ получить правильный размер представления, используя функцию getDefaultSize.В случае, когда View охватывает всю деятельность, вы можете использовать следующий подход для получения измерений области клиента действия:

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

Чтобы сделать View расширенным для всей деятельности:

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);
1 голос
/ 16 февраля 2016

Получите высоту действия:

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

Получите ширину действия

public static int getActivityWidth(Activity activity)
{
    return activity.findViewById(android.R.id.content).getWidth();
}
0 голосов
/ 13 ноября 2018

Вы получите высоту и ширину как 0 в методах onCreate () / onStart () / onResume (). Причина в том, что размер еще не установлен. Если вы хотите узнать текущий размер, вам лучше использовать обозреватель в одном из этих методов и делать то, что вы хотите, когда получите текущий размер.

constraint_layout - корневой элемент макета в коде ниже:

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