我正在使用通话
给视图充气final View view = mActivity.getLayoutInflater().inflate(R.layout.photo_view, null, false);
视图正在膨胀,其唯一目的是将其转换为位图。
以下通话无效。现在,如果我在DialogFragment的onCreateView
内进行调用,那么它就可以了 - 所以我知道代码片段本身是有效的。但是,如果我只是为了进行位图转换而膨胀视图,则永远不会调用方法public void onGlobalLayout()
。
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
Log.i(TAG, "waiting for right time");
view.getViewTreeObserver().addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressLint("NewApi")
@Override
public void onGlobalLayout() {
if (view.getLayoutParams().width <= 0 || view.getLayoutParams().height <= 0) {
int height = getDeviceHeight(mActivity);
int width = getDeviceWidth(mActivity);
LayoutParams layout = view.getLayoutParams();
layout.height = height;
layout.width = width;
view.setLayoutParams(layout);
}
doMyWork(view);
if (Utils.hasJellyBean()) {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
}
我需要这种方法,因为我希望有一个非零维度来创建我的位图,否则我会得到null,例如view.getDrawingCache()
。那么如何强制执行ViewTreeObserver.OnGlobalLayoutListener
答案 0 :(得分:1)
您的视图永远不会附加到窗口 - 它永远不会被框架布局。您需要将其附加到窗口(例如,将其放在某处的布局中),或者手动测量和布局。
int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
view.measure(widthSpec, heightSpec);
view.layout(view.getMeasuredWidth(), view.getMeasuredHeight());
答案 1 :(得分:1)
您的视图未附加到窗口。在onGlobalLayoutListener添加后尝试调用view.requestLayout()
。