如何在膨胀视图中强制调用OnGlobalLayoutListener

时间:2015-03-17 00:23:20

标签: android android-layout bitmap android-view

我正在使用通话

给视图充气
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

2 个答案:

答案 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()