视图维度何时可供主活动使用?



假设我们有一个main_activity.xml布局,它以相对的方式定义所有维度 - 约束,百分比和准则(即百分比(...没有"静态"DP。

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

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

但我们可以这样说:

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

但是,如果在某些情况下,这些"新"视图需要在应用启动时立即显示,该怎么办?

所以,问题:

在 Android 活动生命周期中,何时可以(以某种方式(安全地查询(某些内容(实际/最终/保证的布局尺寸? 那是什么东西,不知何故?

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

我也尝试过从onStart((和onResume((内部进行日志记录,但维度结果总是"0",大概是因为它们还没有膨胀。

我知道任何给定的视图都可以在 onMeasure(( 中获得自己的维度,但是你会在 MainActivity 中创建一个静态变量,以便分配它并从那里使用它......或某种将该信息从视图发送回活动的方法。

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

我的建议是:

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

最新更新