【问题标题】:Viewpager to fill the rest of the pageViewpager 填充页面的其余部分
【发布时间】:2016-06-13 15:31:55
【问题描述】:

我正在尝试将 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 但是寻呼机上的第二个显示为 0。为什么会这样?不应该刷新高度吗?

【问题讨论】:

    标签: android resize android-viewpager height layoutparams


    【解决方案1】:

    试试这个工具,也试试 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)
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 1970-01-01
        • 2018-01-19
        相关资源
        最近更新 更多