web-dev-qa-db-ja.com

NestedScrollViewのfullScroll(View.FOCUS_UP)が正しく機能しない

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);

しかし、何も機能していないようです。今回はサポートライブラリに何か問題がありますか?

11
S Fitz

これを試して

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);
   }
});
_
18
Nilesh Rathod

更新:

より良い解決策を見つけました。このコンボを試してください:

_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つの実用的な解決策が見つかりました:

  1. NestedScrollView.scrollTo(0, 0)(受け入れられた回答を参照、突然ジャンプします)
  2. NestedScrollView.fling(-10000)(スムーズにスクロールしますが、適切な速度値は現在の位置、デバイス、必要なスクロール時間などによって異なります)

私の場合、フォーカス可能性を変更する必要はありませんでした。

14
gmk57

このコードは私のために働きます。

scrollView.post {
    scrollView.fling(0)
    scrollView.fullScroll(ScrollView.FOCUS_UP)
}
3
WuHaojie

28.0.0 Support libでようやく修正されたようですので、NestedScrollView.smoothScrollTo()は期待どおりに機能します

0