我正在尝试将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 :(得分: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的高度无法设置为自定义。