视频可能有点难以看清,但是当我向 Activity 添加新片段时,正在发生的事情是 ScrollView 中的内容出现了奇怪的剪辑。不是平滑地向下动画,而是创建大约 55 像素的额外边距(在 720 x 1280 手机上),然后在动画完成后自行纠正。
我翻遍了源代码,发现如果我将这两个方法从 PullToRefreshBase 类的 onSizeChanged() 方法中注释掉,动画将正常工作:
@Override
protected final void onSizeChanged(int w, int h, int oldw, int oldh) {
if (DEBUG) {
Log.d(LOG_TAG, String.format("onSizeChanged. W: %d, H: %d", w, h));
}
super.onSizeChanged(w, h, oldw, oldh);
//TODO both of these methods below combined cause the glitchy issue
// We need to update the header/footer when our size changes
refreshLoadingViewsSize();
// Update the Refreshable View layout
refreshRefreshableViewSize(w, h);
//TODO both of these methods above combined cause the glitchy issue
/**
* As we're currently in a Layout Pass, we need to schedule another one
* to layout any changes we've made here
*/
post(new Runnable() {
@Override
public void run() {
requestLayout();
}
});
}
refreshLoadingViewsSize() 和 refreshRefreshableViewSize() 方法共同导致了问题。但是,当我将它们注释掉时,PullToRefresh 功能不再起作用。这是因为第一个设置标题大小的方法没有被调用。这意味着标题高度始终为 0,这破坏了下拉功能,该功能依赖于标题的高度来工作。此外,标题本身甚至不会出现,这是行不通的。
不幸的是,只评论一个会使剪辑问题变得更糟。
我还尝试了一个 hacky 修复,我只在第一次调用 onSizeChanged 时运行这两个方法,然后忽略它们。像这样:
if(mFirstGo) {
// We need to update the header/footer when our size changes
refreshLoadingViewsSize();
// Update the Refreshable View layout
refreshRefreshableViewSize(w, h);
mFirstGo = false;
}
除了一个问题外,这很好用。添加片段时,填充设置不正确,导致 ScrollView 的内容高于应有的内容。这是因为填充是第一次设置的,但之后再也不会重置。就好像padding一直都是0没问题,但是如果一开始就设置了,每次view size变化时都需要继续reset。
我认为这个问题的原因是独立于视图变化发生的填充变化,但我不确定。如果有人在这里有一些见识,我将不胜感激。谢谢!