HorizontalScrollView
を含むRelativeLayout
があります。このレイアウトはXMLでは空であり、onCreateのJavaから読み込まれます。
このスクロールビューを最初はRelativeLayout
の中央に配置します。これは画面よりもはるかに大きいです。
機能しないmHorizScrollView.scrollTo(offsetX, 0);
を試しました。これの何が悪いのかわかりません。
コードを投稿することはできますが、実際には関係ありません。重要なのは、すべてがプログラムで行われ(:sが必要)、HorizontalScrollView
の初期位置をプログラムで設定する必要があることです。
読んでくれてありがとう。詳細が必要な場合、またはこれが十分に明確でない場合は、教えてください。
extend
HorizontalScrollView
を上書きして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);
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);
}
それがタイミングの問題かどうかをテストするには(私はそうだと思います)、onStartでscrollTo()を呼び出す代わりに、30程度の遅延でscrollToを呼び出すRunnableでpostDelayed()を呼び出します。
より良いアプローチは、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
}
});
}
}
問題は、ビューにまだサイズがないことです。これを行うクリーンな方法は、ビューにサイズがあり、スクロールが可能であることをアクティビティに通知するために、ScrollViewのonSizeChangedを実装してアクティビティのHandlerにメッセージを送信することです。
View.postを使用し、runメソッド内でscrollTo(x、y)を記述します。 Android APIドキュメント。
ScrollTo関数が機能するはずです。 HSVのlayout_widthとその内部のビューは何ですか?
OnSizeChanged関数が機能するはずです。理解できないのは、ハンドラーがUIスレッドでコードを実行するため、onSizeChangedは、コールバック関数ではなく、アクティビティのハンドラーにメッセージを送信する必要があるということです。それ以外ではUI操作はできません。ハンドラーを見てください。