Viewpager填充页面的其余部分

时间:2016-03-01 09:31:29

标签: android resize android-viewpager height layoutparams

我正在尝试将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上的第一个日志显示:viewpager height:530.0 但是寻呼机上的第二个显示为什么会发生这种情况?它不应该刷新高度吗?

2 个答案:

答案 0 :(得分:1)

尝试使用此util,也可以尝试使用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)
}

答案 1 :(得分:1)

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