Viewpager 填充页面的其余部分

Viewpager to fill the rest of the page

我正在尝试将 viewpager 的大小调整为页面的其余部分。我有这个 globallayout 侦听器:

  ViewTreeObserver viewTreeObserver = pager.getViewTreeObserver();
        viewTreeObserver
                .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                    @Override
                    public void onGlobalLayout() {

                        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.WRAP_CONTENT,
                                LinearLayout.LayoutParams.WRAP_CONTENT);

                        int viewPagerWidth = pager.getWidth();
                        float viewPagerHeight = Constants.screenHeight - findViewById(R.id.view_above_pager).getBottom();
                        Log.i("","viewpager height:" + viewPagerHeight);
                        layoutParams.width = viewPagerWidth;
                        layoutParams.height = (int) viewPagerHeight;

                        pager.setLayoutParams(layoutParams);
                        pager.setMinimumHeight((int)viewPagerHeight);
                        pager.getViewTreeObserver()
                                .removeGlobalOnLayoutListener(this);
                        Log.i("","viewpager height2:" + pager.getHeight());
                    }
                });

貌似是第一个日志,在viewPagerHeight上shows:viewpager height:530.0 但是寻呼机上的第二个显示 0。为什么会这样?不是应该刷新高度吗?

尝试使用此工具,也尝试使用 onPreDraw

public class UViews {
    /**
     * Calls the listener when the onPreDraw method of the {@link ViewTreeObserver.OnPreDrawListener} is called.
     * This method will handle it so the onPreDraw is only called once and will remove the listener.
     *
     * @param view
     * @param listener
     */
    public static void waitForOnPreDraw(final View view, final IOnPreDawListener listener) {
        if (view == null) {
            return;
        }
        ViewTreeObserver treeObs = view.getViewTreeObserver();
        if (treeObs == null) {
            if (listener != null) {
                listener.onPreDraw(view);
            }
            return;
        }
        treeObs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                if (view == null) {
                    if (listener != null) {
                        listener.onPreDraw(null);
                    }
                    return true;
                }
                // IMPORTANT !!! If not removed, it will enter an infinite loop
                ViewTreeObserver treeObs = view.getViewTreeObserver();
                if (treeObs != null && treeObs.isAlive()) {
                    treeObs.removeOnPreDrawListener(this);
                }
                if (listener != null) {
                    listener.onPreDraw(view);
                }
                return true;
            }
        });

    }

    /**
     * Calls the listener when the onGlobalLayout method of the {@link ViewTreeObserver.OnGlobalLayoutListener} is called.
     * This method will handle it so the onGlobalLayout is only called once and will remove the listener.
     *
     * @param view
     * @param listener
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public static void waitForOnGlobalLayout(final View view, final IOnGlobalLayoutListener listener) {
        if (view == null) {
            return;
        }
        ViewTreeObserver treeObs = view.getViewTreeObserver();
        if (treeObs == null) {
            if (listener != null) {
                listener.onGlobalLayout(view);
            }
            return;
        }
        treeObs.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (view == null) {
                    if (listener != null) {
                        listener.onGlobalLayout(null);
                    }
                    return;
                }
                // IMPORTANT !!! If not removed, it will enter an infinite loop
                ViewTreeObserver treeObs = view.getViewTreeObserver();
                if (treeObs != null && treeObs.isAlive()) {
                    treeObs.removeOnGlobalLayoutListener(this);
                }
                if (listener != null) {
                    listener.onGlobalLayout(view);
                }
            }
        });

    }



    //------------------------------------------------- INTERFACE(start)
    public interface IOnPreDawListener {
        void onPreDraw(View view);
    }

    public interface IOnGlobalLayoutListener {
        void onGlobalLayout(View view);
    }
    //------------------------------------------------- INTERFACE(end)
}

它在 ScrollView 中,这是我的问题。重构了一点设计,现在它可以工作了。 我不确定,但我认为 ScrollView 强制孩子们包装内容,所以我的 viewpager 的高度无法设置自定义。