ScrollView
をプログラムで特定の位置にスクロールする方法はありますか?
TableLayout
に配置される動的なScrollView
を作成しました。したがって、特定のアクション(ボタンのクリックなど)で、特定の行が自動的に一番上の位置にスクロールするようにしたいです。
出来ますか?
ScrollView sv = (ScrollView)findViewById(R.id.scrl);
sv.scrollTo(0, sv.getBottom());
または
sv.scrollTo(5, 10);
Pragnaからの答えは常に機能するとは限りません。これを試してください:
mScrollView.post(new Runnable() {
public void run() {
mScrollView.scrollTo(0, mScrollView.getBottom());
}
});
または
mScrollView.post(new Runnable() {
public void run() {
mScrollView.fullScroll(mScrollView.FOCUS_DOWN);
}
});
スクロールして開始する場合
mScrollView.post(new Runnable() {
public void run() {
mScrollView.fullScroll(mScrollView.FOCUS_UP);
}
});
ScrollViewをonCreateView()の直後(ボタンのクリック後ではなく)に直接スクロールさせたいと思いました。動作させるには、ViewTreeObserverを使用する必要がありました。
mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mScrollView.post(new Runnable() {
public void run() {
mScrollView.fullScroll(View.FOCUS_DOWN);
}
});
}
});
ただし、これは何かがレイアウトされるたびに呼び出されることに注意してください(たとえば、ビューを非表示または類似のものに設定した場合)。
SDK Lvlのpublic void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
<16
または
SDK Lvlのpublic void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
> = 16
次のようなものを使用します。
mScrollView.scrollBy(10, 10);
または
mScrollView.scrollTo(10, 10);
ここにはたくさんの良い答えがありますが、一つだけ追加したいと思います。上下にスクロールするのではなく、ScrollViewをレイアウトの特定のビューにスクロールしたい場合があります。
簡単な例:登録フォームで、フォームの編集テキストが入力されていないときにユーザーが「サインアップ」ボタンをタップした場合、その特定の編集テキストまでスクロールして、そのフィールドに入力する必要があることをユーザーに伝えます。
その場合、次のようなことができます。
scrollView.post(new Runnable() {
public void run() {
scrollView.scrollTo(0, editText.getBottom());
}
});
または、インスタントスクロールではなくスムーズスクロールが必要な場合:
scrollView.post(new Runnable() {
public void run() {
scrollView.smoothScrollTo(0, editText.getBottom());
}
});
明らかに、テキストの編集の代わりに任意のタイプのビューを使用できます。 getBottom()は、その親レイアウトに基づいてビューの座標を返すため、ScrollView内で使用されるすべてのビューは親のみを持つ必要があります(たとえば、線形レイアウト)。
ScrollViewの子の中に複数の親がある場合、私が見つけた唯一の解決策は、親ビューでrequestChildFocusを呼び出すことです:
editText.getParent().requestChildFocus(editText, editText);
ただし、この場合、スムーズなスクロールはできません。
この答えが同じ問題を抱えている人の助けになることを願っています。
scrollTo
メソッドを使用してみてください 詳細
すぐにスクロールしたい場合は、次を使用できます。
ScrollView scroll= (ScrollView)findViewById(R.id.scroll);
scroll.scrollTo(0, scroll.getBottom());
OR
scroll.fullScroll(View.FOCUS_DOWN);
OR
scroll.post(new Runnable() {
@Override
public void run() {
scroll.fullScroll(View.FOCUS_DOWN);
}
});
または、これを使用できるようにスムーズにゆっくりスクロールしたい場合:
private void sendScroll(){
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
try {Thread.sleep(100);} catch (InterruptedException e) {}
handler.post(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(View.FOCUS_DOWN);
}
});
}
}).start();
}
私はこれをScrollViewの下部にスクロールするように動作させました(内部にTextViewがあります):
(TextViewを更新するメソッドにこれを置きます)
final ScrollView myScrollView = (ScrollView) findViewById(R.id.myScroller);
myScrollView.post(new Runnable() {
public void run() {
myScrollView.fullScroll(View.FOCUS_DOWN);
}
});
はい、できます。
Layout
を1つ取得し、その中にViews
を多数取得したとします。したがって、プログラムでView
にスクロールする場合は、次のコードスニペットを記述する必要があります。
例えば。
content_main.xml
<ScrollView
Android:id="@+id/scrollView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<Button
Android:id="@+id/btn"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
<TextView
Android:id="@+id/txtView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
MainActivity.Java
ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
Button btn = (Button) findViewById(R.id.ivEventBanner);
TextView txtView = (TextView) findViewById(R.id.ivEditBannerImage);
特定のView
までスクロールしたい場合、この場合txtviewと書いてください:
scrollView.smoothScrollTo(txtView.getScrollX(),txtView.getScrollY());
そして、あなたは完了です。
**希望の高さまでスクロールします。私はいくつかの良い解決策を思いつきました**
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.scrollBy(0, childView.getHeight());
}
}, 100);
座標を含まない別の答えを追加します。
これにより、目的のビューにフォーカスが移動します(ただし、一番上の位置には移動しません)。
yourView.getParent().requestChildFocus(yourView,yourView);
public void RequestChildFocus(子の表示、フォーカスの表示)
child-フォーカスが必要なこのViewParentの子。このビューには、フォーカスされたビューが含まれます。実際にフォーカスがあるのは、必ずしもビューではありません。
focused-実際にフォーカスを持っている子の子孫であるビュー
ちょうどページスクロール:
ScrollView sv = (ScrollView) findViewById(your_scroll_view);
sv.pageScroll(View.FOCUS_DOWN);
注:すでにスレッドに参加している場合は、新しい投稿スレッドを作成する必要があります。そうしないと、新しい長い高さまでスクロールしません(私にとっては)。例:
void LogMe(final String s){
runOnUiThread(new Runnable() {
public void run() {
connectionLog.setText(connectionLog.getText() + "\n" + s);
final ScrollView sv = (ScrollView)connectLayout.findViewById(R.id.scrollView);
sv.post(new Runnable() {
public void run() {
sv.fullScroll(sv.FOCUS_DOWN);
/*
sv.scrollTo(0,sv.getBottom());
sv.scrollBy(0,sv.getHeight());*/
}
});
}
});
}
誰もがこのような複雑な答えを投稿しています。
一番下までスクロールするための簡単な答えを見つけました:
final ScrollView myScroller = (ScrollView) findViewById(R.id.myScrollerView);
// Scroll views can only have 1 child, so get the first child's bottom,
// which should be the full size of the whole content inside the ScrollView
myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() );
また、必要に応じて、上記の2行目のコードを実行可能ファイルに配置できます。
myScroller.post( new Runnable() {
@Override
public void run() {
myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() );
}
}
この簡単な解決策を見つけるには、多くの調査と遊びが必要でした。それもあなたのお役に立てば幸いです! :)
Runnableをsv.fullScroll(View.FOCUS_DOWN)で使用していました。差し迫った問題には完全に機能しますが、そのメソッドはScrollViewに画面全体からフォーカスを取得させ、毎回AutoScrollを発生させると、EditTextはユーザーから情報を受け取ることができず、私のソリューションは別のコードを使用しました実行可能ファイルの下:
sv.scrollTo(0、sv.getBottom()+ sv.getScrollY());
重要な視点に集中することなく同じことをする
ご挨拶。
I had to create Interface
public interface ScrollViewListener {
void onScrollChanged(ScrollViewExt scrollView,
int x, int y, int oldx, int oldy);
}
import Android.content.Context;
import Android.util.AttributeSet;
import Android.widget.ScrollView;
public class CustomScrollView extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public ScrollViewExt(Context context) {
super(context);
}
public CustomScrollView (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomScrollView (Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
}
}
}
<"Your Package name ".CustomScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/scrollView"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:focusableInTouchMode="true"
Android:scrollbars="vertical">
private CustomScrollView scrollView;
scrollView = (CustomScrollView)mView.findViewById(R.id.scrollView);
scrollView.setScrollViewListener(this);
@Override
public void onScrollChanged(ScrollViewExt scrollView, int x, int y, int oldx, int oldy) {
// We take the last son in the scrollview
View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1);
int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));
// if diff is zero, then the bottom has been reached
if (diff == 0) {
// do stuff
//TODO keshav gers
pausePlayer();
videoFullScreenPlayer.setVisibility(View.GONE);
}
}
それは私のために働いています
mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mScrollView.post(new Runnable() {
public void run() {
mScrollView.fullScroll(View.FOCUS_DOWN);
}
});
}
});
private int totalHeight = 0;
ViewTreeObserver ScrollTr = loutMain.getViewTreeObserver();
ScrollTr.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
loutMain.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
loutMain.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
TotalHeight = loutMain.getMeasuredHeight();
}
});
scrollMain.smoothScrollTo(0, totalHeight);