2017-09-11 45 views
2

複数のTextView、2つの静的なGridView、さらにはFrameLayoutを使ってFragmentを表示する、一連のLinearLayoutを持つNestedScrollViewを作成しました。これのすべての下に。NestedScrollViewのfullScroll(View.FOCUS_UP)が正しく機能していない

ユーザーが特定のポイントの下にスクロールした場合は、[戻る]ボタンを押すと、代わりの活動を終え、「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の元のスクロール位置の下からスクロールを開始し、元の位置から停止するようです。だからちょうど奇妙な吃音として現れます。しかし、いくつかのポジションでは、トップにスクロールします(非常にまれで矛盾していますが)。実際にはスクロールして下に移動します。

私はビューのフォーカスを実験していますが、無駄です。例えば、私は静的なGridViewsがスクロール中にフォーカスを中断するかもしれないと読んでいます。私はまた、このような

scrollview.pageScroll(View.FOCUS_UP); 

scrollview.smoothScrollTo(0,0); 

として、スクロールアップするために、様々な異なる方法を試してみた。しかし、何も動作していないようにみえます。今回はサポートライブラリに何か問題がありますか?

+0

追加 'アンドロイド:NestedScrollView'' '内部LinearLayout'これも' NestedScrollView.scrollToにdescendantFocusability = "blocksDescendants" '(0、0); ' –

+0

これは実際には信じられないほど効果的です。上記のすべて(smoothScrollTo、pageScroll、fullScroll)は動作しませんが、scrollToは動作します。 smoothScrollToの滑らかさを犠牲にしなければなりませんが、以前よりも優れています。巨大な感謝! –

答えて

4

UPDATEこの

NestedScrollView使用の先頭にスクロールすることも

NestedScrollViewと、この内側LinearLayoutandroid:descendantFocusability="blocksDescendants"を追加し、この

NestedScrollView.scrollTo(0, 0); 
+0

スムーススクロールはどうですか? –

6

を試してみてください。より良い発見

溶液。このコンボを試してみてください:

scrollView.fling(0); // Sets mLastScrollerY for next command 
scrollView.smoothScrollTo(0, 0); // Starts a scroll itself 

は(サポートライブラリ26.0.0 & 27.0.2でテスト済み)ハックのように見えますが、両方の私のデバイスに適しています。他の位置にスムーズにスクロールすることができます。問題がmissing update of mLastScrollerYにあるという考えに基づいています。

あなたに役立つかどうかフィードバックをお寄せください。

オリジナルの答え:この問題は、あまりにも

ヒット。

NestedScrollView.smoothScrollTo(0, 0)は25.4.0までサポートライブラリで働いていた、と27.0.2現在まで26.0.0以降は動作しません。 NestedScrollViewの内容は重要ではありません(一部のTextViewで十分です)。

このバグは既にGoogleの課題トラッカーにreportedtwiceです。それを再現するための最小限のプロジェクトはGitHubにあります。

2つの作業溶液実測値:

  1. NestedScrollView.scrollTo(0, 0)(突然ジャンプし、受け入れ答えを参照)
  2. NestedScrollView.fling(-10000)(スクロール滑らかを、適当な速度値は、現在の位置、装置、所望のスクロール時間などに依存します)

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

+1

ありがとうございます。「fling(-10000)」は私のために働くソリューションです。あなたはコンテンツの高さに応じて 'velocityY'を計算する方法を知っていますか? – Fori

+0

27.0.2を使っても 'NestedScrollView.smoothScrollTo'は私にとっては機能しません。 NestedScrollViewが上にスクロールするのではなく、その場所にジャンプしています。 –

+0

@Fori、信頼できる汎用式が存在するかどうかはわかりません。速度を2増加させると距離は3.333増加しますが、異なるデバイスで同じ速度が異なる距離を与えます。したがって、 'requiredVelocity =(int)-Math.pow(scrollView.getScrollY()* deviceFactor、0.5752)'です。トップでゆっくりと停止するには、 'deviceFactor'は自分の携帯電話では1417、タブレットでは1146でなければなりませんが、任意のデバイス(画面の密度に比例しません)でどのように決定するかわかりません。一方、元の 'pageScroll' /' smoothScrollTo'は常にオーバースケールされていますので、より高い値(2000?)を使用することがあります。 – gmk57

0

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

scrollView.post { 
    scrollView.fling(0) 
    scrollView.fullScroll(ScrollView.FOCUS_UP) 
} 
関連する問題