[java] Android에서 ScrollView를 프로그래밍 방식으로 스크롤 할 수 있습니까?

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();
    }