web-dev-qa-db-ja.com

プログラムでHorizo​​ntalScrollViewをスクロールする方法

HorizontalScrollViewを含むRelativeLayoutがあります。このレイアウトはXMLでは空であり、onCreateのJavaから読み込まれます。

このスクロールビューを最初はRelativeLayoutの中央に配置します。これは画面よりもはるかに大きいです。

機能しないmHorizScrollView.scrollTo(offsetX, 0);を試しました。これの何が悪いのかわかりません。

コードを投稿することはできますが、実際には関係ありません。重要なのは、すべてがプログラムで行われ(:sが必要)、HorizontalScrollViewの初期位置をプログラムで設定する必要があることです。

読んでくれてありがとう。詳細が必要な場合、またはこれが十分に明確でない場合は、教えてください。

21
Benoit Duffez

extendHorizontalScrollViewを上書きしてonLayoutをオーバーライドすると、onLayoutへのスーパーコールの後、きれいにスクロールできることがわかりました。

MyScrollView extends HorizontalScrollView {
    protected void onLayout (boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        this.scrollTo(wherever, 0);
    }
}

EDIT:startまたはendにスクロールするには、次のように使用できます。

this.fullScroll(HorizontalScrollView.FOCUS_RIGHT/FOCUS_LEFT);

の代わりに

this.scrollTo(wherever, 0);
26
HalR
public void autoSmoothScroll() {

        final HorizontalScrollView hsv = (HorizontalScrollView) view.findViewById(R.id.horiscroll);
        hsv.postDelayed(new Runnable() {
            @Override
            public void run() {
                //hsv.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
                hsv.smoothScrollBy(500, 0);
            }
        },100);
    }
25
tekkavi

それがタイミングの問題かどうかをテストするには(私はそうだと思います)、onStartでscrollTo()を呼び出す代わりに、30程度の遅延でscrollToを呼び出すRunnableでpostDelayed()を呼び出します。

16
Ted Hopp

より良いアプローチは、ViewTreeObserverを使用してレイアウトを観察することです。

View interestedInView;
onCreate(){
  //Code

  //Observe for a layout change
  ViewTreeObserver viewTreeObserver = interestedInView.getViewTreeObserver();
  if (viewTreeObserver.isAlive()) {
    viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        //REMOVE THE VIEWTREE OBSERVER
        //interestedInView is ready for size and position queries because it has been laid out
      }
    });
  }
}
9

問題は、ビューにまだサイズがないことです。これを行うクリーンな方法は、ビューにサイズがあり、スクロールが可能であることをアクティビティに通知するために、ScrollViewのonSizeChangedを実装してアクティビティのHandlerにメッセージを送信することです。

1
Alexandros

View.postを使用し、runメソッド内でscrollTo(x、y)を記述します。 Android APIドキュメント。

1
Piyush

ScrollTo関数が機能するはずです。 HSVのlayout_widthとその内部のビューは何ですか?

0
Jason LeBrun

OnSizeChanged関数が機能するはずです。理解できないのは、ハンドラーがUIスレッドでコードを実行するため、onSizeChangedは、コールバック関数ではなく、アクティビティのハンドラーにメッセージを送信する必要があるということです。それ以外ではUI操作はできません。ハンドラーを見てください。

0