Как узнать видимый размер моей активности?
Я пытаюсь получить реальный размер Activity,
а не высота и ширина от getHeight()
и getWidth()
,
который дает мне полный экран экрана.
Как узнать видимый размер моей активности?
Я пытаюсь получить реальный размер Activity,
а не высота и ширина от getHeight()
и getWidth()
,
который дает мне полный экран экрана.
Я нашел способ узнать точную высоту своей активности: если у вас есть представление, заполняющее весь доступный экран за заголовком и панель задач, просто используйте getBottom()
, чтобы получить реальную высоту этой активности.
Я думаю, вам нужно посмотреть Activity.getWindow()
и Window.getDecorView()
и получить ширину/высоту этого.
Я сделал это с использованием корневого макета, проблема в том, что вы не можете получить эту информацию (ширину и высоту) в методах onCreate/onStart/onResume, когда они запущены в первый раз.
В любой момент после этого размер можно получить из корневого макета (LinearLayout/FrameLayout/TableLayout/etc), в моем случае я использовал 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");
Существует простой способ получить правильный вид с помощью функции getDefaultSize
. В случае охвата View для всей активности вы можете использовать следующий подход для получения размеров области клиента деятельности:
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int viewWidth = getDefaultSize(getWidth(), widthMeasureSpec);
int viewHeight = getDefaultSize(getHeight(), heightMeasureSpec);
...
}
Чтобы сделать просмотр расширенным для всей активности:
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);
Если вы используете 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, иначе он будет запускаться каждый раз, когда что-то изменится в вашем макете.
Получить высоту активности:
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();
}
Мне нравятся более длительные ответы:
myActivity.getWindow().getDecorView().getHeight();
myActivity.getWindow().getDecorView().getWidth();