【问题标题】:When do View dimensions become available to MainActivity?MainActivity 什么时候可以使用 View 维度?
【发布时间】:2019-02-26 12:24:12
【问题描述】:

假设我们有一个 main_activity.xml 布局,它以相对方式定义所有维度——约束、百分比和指南(即百分比)...没有“静态”dp。

但在 MainActivity.java 中,我们以编程方式创建了一些子视图,并且我们希望将它们的高度/宽度尺寸定义为相对于现有视图。

我们不知道设备的尺寸或密度,所以我们也不知道运行时之前任何视图的(实际整数)尺寸......

但我们可以这样说:

int heightDimensionForNewView = (int) (someAlreadyInflatedView.getHeight() / 7f)

但是,如果在某些情况下,这些“新”视图需要在应用启动时立即显示呢?

那么问题来了:

在 Android Activity 生命周期中,您可以(以某种方式)安全地查询(某物)实际/最终/保证布局尺寸的最早时间点是什么时候?那是什么东西?

我无法找到诸如“onContentViewInflated()”之类的覆盖方法,并且没有像 Fragments 中那样的 onCreateView() 方法。

我也尝试过从 onStart() 和 onResume() 内部记录,但维度结果始终为“0”,大概是因为它们尚未膨胀。

我知道任何给定的 View 都可以在 onMeasure() 中获得自己的维度,但是您必须在 MainActivity 中创建一个静态变量以便分配它并从那里使用它......或者以某种方式发送该信息从 View 回到 Activity。

我错过了什么?我只是希望能够以某种方式从 MainActivity 本身获取数字。

【问题讨论】:

    标签: android user-interface layout view dimensions


    【解决方案1】:

    我的建议是:

    view.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) {
            int oldWidth = oldRight - oldLeft; // right exclusive, left inclusive
            if( v.getWidth() != oldWidth ) {
                // width has changed
            }
        }
    });
    

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // View has laid out
    
            // Remove the layout observer if you don't need it anymore
            view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    });
    

    【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2012-07-09
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多