回答:
scroll.fullScroll(View.FOCUS_DOWN)
また動作するはずです。
これを scroll.Post(Runnable run)
コトリンコード
scrollView.post {
scrollView.fullScroll(View.FOCUS_DOWN)
}
次のようにscroll.post内でコードを実行する必要があります。
scroll.post(new Runnable() {
@Override
public void run() {
scroll.fullScroll(View.FOCUS_DOWN);
}
});
scroll.scrollTo(0, scroll.getHeight());
して下部にジャンプするかscroll.smoothScrollTo(0, scroll.getHeight());
、スクロールをスムーズにすることができます
scrollView.post { scrollView.fullScroll(View.FOCUS_DOWN) }
scroll.fullScroll(View.FOCUS_DOWN)
焦点の変化につながります。複数のフォーカス可能なビュー(2つのEditTextなど)がある場合、奇妙な動作が発生します。この質問には別の方法があります。
View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
int sy = scrollLayout.getScrollY();
int sh = scrollLayout.getHeight();
int delta = bottom - (sy + sh);
scrollLayout.smoothScrollBy(0, delta);
これはうまくいきます。
Kotlin拡張
fun ScrollView.scrollToBottom() {
val lastChild = getChildAt(childCount - 1)
val bottom = lastChild.bottom + paddingBottom
val delta = bottom - (scrollY+ height)
smoothScrollBy(0, delta)
}
scrollView.postが機能しない場合がある
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});
しかし、scrollView.postDelayedを使用すると、確実に機能します
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
},1000);
私にとって最も効果的だったのは
scroll_view.post(new Runnable() {
@Override
public void run() {
// This method works but animates the scrolling
// which looks weird on first load
// scroll_view.fullScroll(View.FOCUS_DOWN);
// This method works even better because there are no animations.
scroll_view.scrollTo(0, scroll_view.getBottom());
}
});
完全に機能するようにインクリメントします。
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();
}
注意
この回答は、Androidの本当に古いバージョンの回避策です。今日、postDelayed
これ以上そのバグはないので、それを使用する必要があります。
postDelayed
:)を使用することを願っています
ビューがまだロードされていない場合、スクロールできません。上記のようにpostまたはsleepコールで「後で」それを行うことができますが、これはあまりエレガントではありません。
スクロールを計画し、次のonLayout()で実行することをお勧めします。ここにサンプルコード:
下にスクロールする他のいくつかの方法があります
fun ScrollView.scrollToBottom() {
// use this for scroll immediately
scrollTo(0, this.getChildAt(0).height)
// or this for smooth scroll
//smoothScrollBy(0, this.getChildAt(0).height)
// or this for **very** smooth scroll
//ObjectAnimator.ofInt(this, "scrollY", this.getChildAt(0).height).setDuration(2000).start()
}
使用する
scrollviewがすでにレイアウトされている場合
my_scroll_view.scrollToBottom()
スクロールビューが完全にレイアウトされていない場合(例:Activity onCreate
メソッドで下にスクロールします...)
my_scroll_view.post {
my_scroll_view.scrollToBottom()
}
質問に対する答えは正確ではありませんが、EditTextにフォーカスが移ったらすぐに下にスクロールする必要がありました。しかし、受け入れられた答えは、ETもすぐにフォーカスを失うことになります(私が想定しているScrollViewに対して)。
私の回避策は次のとおりです:
emailEt.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
Toast.makeText(getActivity(), "got the focus", Toast.LENGTH_LONG).show();
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
}, 200);
}else {
Toast.makeText(getActivity(), "lost the focus", Toast.LENGTH_LONG).show();
}
}
});
実際にfullScrollを2回呼び出すとうまくいくことがわかりました。
myScrollView.fullScroll(View.FOCUS_DOWN);
myScrollView.post(new Runnable() {
@Override
public void run() {
myScrollView.fullScroll(View.FOCUS_DOWN);
}
});
最初の(失敗した)スクロールを実行した直後のpost()メソッドのアクティブ化と関係がある可能性があります。この動作は、myScrollViewの以前のメソッド呼び出しの後に発生するので、最初のfullScroll()メソッドを、関連する可能性のある他の何かに置き換えてみることができます。
scroll.fullScroll(View.FOCUS_DOWN)
ラップされ.post()
ていても機能しない理由の1つとして、ビューがレイアウトされていないことが考えられます。この場合、View.doOnLayout()がより良いオプションになります。
scroll.doOnLayout(){
scroll.fullScroll(View.FOCUS_DOWN)
}
または、勇敢な魂のためにさらに精巧な何か:https : //chris.banes.dev/2019/12/03/suspending-views/