2

问题视频在这里

链接到图书馆

视频可能有点难以看清,但是当我向 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。

我认为这个问题的原因是独立于视图变化发生的填充变化,但我不确定。如果有人在这里有一些见识,我将不胜感激。谢谢!

4

0 回答 0