2016-03-01 101 views
0

我试图调整viewpager到页面的其余部分。我有这个globallayout听众:Viewpager填充页面的其余部分

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高度:530.0 但第二个呼机上显示为0。为什么会出现这种情况?它不应该刷新高度吗?

回答

1

这是一个滚动型尝试,那就是我的问题。重构了一下设计,现在它可以工作。 我不确定,但我认为ScrollView强制孩子们包装内容,所以然后我的viewpager的高度不能设置自定义。

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) 
} 
+0

nope :)))在预绘制时不起作用,仍然是0 –

相关问题