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