Android 如何获取活动的可见大小?

Android 如何获取活动的可见大小?,android,screen,screen-size,Android,Screen,Screen Size,我如何知道活动的可见大小 我正在尝试获取活动的实际大小, 不是getHeight()和getWidth(), 这给了我整个屏幕的大小。我想你会想看看活动.getWindow()和窗口.getDecorView(),然后得到它的宽度/高度。我找到了一种方法来知道我活动的确切高度:如果你有一个视图填充标题栏和任务栏后面所有可用的屏幕,只需使用View.getBottom()即可获得该活动的实际高度。我使用我的根布局完成了此操作,问题是当onCreate/onStart/onResume方法第一次运行

我如何知道活动的可见大小

我正在尝试获取活动的实际大小,
不是
getHeight()
getWidth()


这给了我整个屏幕的大小。

我想你会想看看
活动.getWindow()
窗口.getDecorView()
,然后得到它的宽度/高度。

我找到了一种方法来知道我活动的确切高度:如果你有一个视图填充标题栏和任务栏后面所有可用的屏幕,只需使用
View.getBottom()
即可获得该活动的实际高度。

我使用我的根布局完成了此操作,问题是当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() );
或:

从这里编辑--------------------------------------------------------

我找到了一种方法来获取关于onCreted方法的信息,但前提是您有多个活动。在我的例子中,我有一个称为第二个活动的主要活动

在调用第二个活动之前,通过一个新的Itent,我可以为第二个活动添加额外的信息。以下是您在第一个活动中需要的代码:

Intent i = new Intent(this, SecondActivity.class);
i.putExtra("width", f.getMeasuredWidth());
i.putExtra("height", f.getMeasuredHeight());
startActivity(i);
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);
之后,在第二个活动中,您可以通过第二个活动的onCreate方法检索以下信息:

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

使用
getDefaultSize
函数可以获得正确的视图大小。如果视图跨越整个活动,您可以使用下一种方法获取活动客户端区域维度:

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    int viewWidth = getDefaultSize(getWidth(), widthMeasureSpec); 
    int viewHeight = getDefaultSize(getHeight(), heightMeasureSpec);
    ...
}
要使视图扩展到整个活动,请执行以下操作:

Intent i = new Intent(this, SecondActivity.class);
i.putExtra("width", f.getMeasuredWidth());
i.putExtra("height", f.getMeasuredHeight());
startActivity(i);
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);
获取活动的高度:

Intent i = new Intent(this, SecondActivity.class);
i.putExtra("width", f.getMeasuredWidth());
i.putExtra("height", f.getMeasuredHeight());
startActivity(i);
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);
获取活动的宽度


如果您正在使用数据绑定(您应该这样做),那么可以调用
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,否则每当布局发生任何变化时,它都会运行此选项。

我更喜欢省时的答案:

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

在onCreate()/onStart()/onResume()方法中,高度和宽度将为0。原因是大小尚未设置。 如果您想知道当前大小,最好在其中一种方法中使用observer,并在获得当前大小时执行所需操作

约束\u布局是以下代码中的布局根元素:

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

你为什么要这么做?在大多数情况下,这是不必要的,而且你可能需要它来做的大多数事情都可以通过android附带的更好的技术来处理不同的屏幕大小。我真的需要知道活动的宽度和高度有多少像素。这与地图精度有关。您是使用地图视图还是自定义视图来显示地图?是的,我正在从头创建一个地图视图,以获取专有地图信息。我发现自己实现它比使用别人的代码(至少对我来说:-)更容易;我仍然得到0,奇怪。您调用它太早了,它在onCreate()期间没有高度。我认为最好是向TreeObserver sceneView.getViewTreeObserver().addOnPreDrawListener(新ViewTreeObserver.OnPreDrawListener(){@Override public boolean onPreDraw(){sceneView.getViewTreeObserver()添加一个预绘制侦听器().removeOnPreDrawListener(this);//这里的代码有什么的window)getBottom()?什么类有这个方法?任何视图:它相对于父级,这就是为什么在这种情况下需要它是一个填充所有可用屏幕的视图。int height=this.getWindow().getDecorView().getBottom();getWindow().getDecorView().getBottom()返回屏幕的高度(以像素为单位)。如果您正试图在布局发生之后、视图呈现之前获取布局的尺寸,这是一个有效的答案。这是错误的。高度将包括屏幕底部Android的状态栏和导航栏的高度。为什么您认为您的状态栏和导航栏活力酒吧不在窗户上吗?