NestedScrollViewに垂直LinearLayoutが設定されており、それ自体にさまざまなビュータイプの子が多数あります。複数のTextView、2つの静的GridView、さらにはこれらすべての下にフラグメントを表示するFrameLayoutです。
戻るボタンを押したときに、ユーザーが特定のポイントより下にスクロールした場合、アクティビティを終了する代わりに、「scrollToTop」メソッドが呼び出されます。
public static void scrollToTop(final NestedScrollView scrollview) {
new Handler().postDelayed(new Runnable() {
public void run() {
scrollview.fullScroll(NestedScrollView.FOCUS_UP);
}
}, 200);
}
これは、Playストアにある以前のバージョンのアプリで機能します。しかし今、アプリをターゲットに更新した後Android Oreo(およびサポートライブラリをバージョン26.0.2に更新))、上にスクロールする代わりに、NestedScrollViewの元のファイルの下からスクロールを開始するようです位置をスクロールし、元の場所で停止します。そのため、奇妙なスタッターとして表示されます。ただし、一部の位置では(非常にまれで一貫性がありませんが)上にスクロールし、その他の位置では実際には下にスクロールします。わかりません。
私はビューのフォーカス可能性を実験してきましたが、役に立ちませんでした。たとえば、静的GridViewがスクロール中にフォーカスを中断する可能性があることを読みました。また、上にスクロールするためのさまざまな方法を試しました。
scrollview.pageScroll(View.FOCUS_UP);
そして
scrollview.smoothScrollTo(0,0);
しかし、何も機能していないようです。今回はサポートライブラリに何か問題がありますか?
これを試して
LinearLayout
内のNestedScrollView
に_Android:descendantFocusability="blocksDescendants"
_を追加します。これも
NestedScrollView
の一番上までスクロールするにはこれを使用します
_NestedScrollView.scrollTo(0, 0);
_
編集
fling()
および smoothScrollTo
一緒に
_nestedScrollView.post(new Runnable() {
@Override
public void run() {
nestedScrollView.fling(0);
nestedScrollView.smoothScrollTo(0, 0);
}
});
_
更新:
より良い解決策を見つけました。このコンボを試してください:
_scrollView.fling(0); // Sets mLastScrollerY for next command
scrollView.smoothScrollTo(0, 0); // Starts a scroll itself
_
ハックのように見えますが、両方のデバイスでうまく機能します(サポートライブラリ26.0.0および27.0.2でテスト済み)。他の位置にスムーズにスクロールするために使用できます。問題は mLastScrollerYの更新がない にあるという考えに基づいています。
それがあなたのために働くかどうかフィードバックを残してください。
元の回答:
この問題もヒットします。
NestedScrollView.smoothScrollTo(0, 0)
は25.4.0までサポートライブラリで機能し、26.0.0から現在の27.0.2までは機能しません。 NestedScrollViewの内容は重要ではありません(一部のTextViewで十分です)。
このバグは、Google Issue Trackerですでに 報告済み2回 です。それを再現するための最小限のプロジェクトは GitHub にあります。
2つの実用的な解決策が見つかりました:
NestedScrollView.scrollTo(0, 0)
(受け入れられた回答を参照、突然ジャンプします)NestedScrollView.fling(-10000)
(スムーズにスクロールしますが、適切な速度値は現在の位置、デバイス、必要なスクロール時間などによって異なります)私の場合、フォーカス可能性を変更する必要はありませんでした。
このコードは私のために働きます。
scrollView.post {
scrollView.fling(0)
scrollView.fullScroll(ScrollView.FOCUS_UP)
}
28.0.0 Support libでようやく修正されたようですので、NestedScrollView.smoothScrollTo()
は期待どおりに機能します