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);
}
});
답변
onViewView () 직후에 scrollView를 스크롤하고 싶었습니다 (예 : 버튼 클릭 후가 아님). 제대로 작동하려면 ViewTreeObserver를 사용해야했습니다.
mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mScrollView.post(new Runnable() {
public void run() {
mScrollView.fullScroll(View.FOCUS_DOWN);
}
});
}
});
그러나 무언가가 레이아웃 될 때마다 (예를 들어 보이지 않는 또는 유사한 뷰를 설정하는 경우) 호출 될 것이므로 더 이상 필요하지 않은 경우이 리스너를 제거하는 것을 잊지 마십시오.
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
SDK Lvl <16에서
또는
public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
SDK Lvl에서> 16
답변
여기에 좋은 답변이 많이 있지만 한 가지만 추가하고 싶습니다. 때로는 상단 또는 하단으로 전체 스크롤하는 대신 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);
그러나이 경우에는 부드러운 스크롤을 가질 수 없습니다.
이 답변이 동일한 문제를 가진 사람을 도울 수 있기를 바랍니다.
답변
다음과 같이 사용하십시오 :
mScrollView.scrollBy(10, 10);
또는
mScrollView.scrollTo(10, 10);
답변
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();
}