답변:
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)
초점의 변화로 이어질 것입니다. 두 개의 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);
이것은 잘 작동합니다.
코 틀린 확장
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
:)
뷰가 아직로드되지 않으면 스크롤 할 수 없습니다. 위와 같이 게시물 또는 수면 통화로 '나중에'할 수 있지만 이는 그리 우아하지 않습니다.
스크롤을 계획하고 다음 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()
}
사용
스크롤보기가 이미 배치되어 있다면
my_scroll_view.scrollToBottom()
스크롤보기가 완료되지 않은 경우 (예 : 활동 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을 두 번 호출하면 트릭이 수행됩니다.
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()
는보기가 배치되지 않았기 때문입니다. 이 경우 View.doOnLayout () 이 더 나은 옵션이 될 수 있습니다.
scroll.doOnLayout(){
scroll.fullScroll(View.FOCUS_DOWN)
}
또는 용감한 영혼을 위해 더 정교하게 만든 것 : https://chris.banes.dev/2019/12/03/suspending-views/