ビデオは少し見にくいかもしれませんが、Activity に新しいフラグメントを追加すると、ScrollView のコンテンツが奇妙にクリッピングされます。スムーズに下方向にアニメーション化する代わりに、(720 x 1280 の電話で) 約 55 ピクセルの余分なマージンを作成し、アニメーションが完了すると自動的に修正されます。
ソース コードを調べたところ、PullToRefreshBase クラスの onSizeChanged() メソッドから次の 2 つのメソッドをコメントアウトすると、アニメーションが正しく機能することがわかりました。
@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 であることを意味し、ヘッダーの高さに依存して機能するプルダウン機能が壊れます。さらに、ヘッダー自体も表示されず、機能しません。
残念ながら、1 つだけコメントアウトすると、クリッピングの問題がさらに悪化します。
また、onSizeChanged の最初の呼び出しでのみこれらの 2 つのメソッドを実行し、その後は無視するハック修正も試みました。このような:
if(mFirstGo) {
// We need to update the header/footer when our size changes
refreshLoadingViewsSize();
// Update the Refreshable View layout
refreshRefreshableViewSize(w, h);
mFirstGo = false;
}
これは、1つの問題を除いてうまく機能します。フラグメントが追加されると、ScrollView のコンテンツが必要以上に高くなるように、パディングが正しく設定されません。これは、パディングが最初に設定された後、再度リセットされることがないためです。これは、パディングがずっと 0 の場合は問題にならないようなものですが、最初に設定されている場合は、ビュー サイズが変更されるたびにリセットし続ける必要があります。
この問題の原因は、ビューの変更とは無関係にパディングの変更が発生していることだと思いますが、正確にはわかりません。誰かがここで洞察を持っていれば、本当に感謝しています。ありがとう!