활동 시작시 ScrollView에서 맨 아래로 스크롤하는 방법


96

ScrollView에 일부 데이터를 표시하고 있습니다. 활동 시작 (onCreate 메서드)에서 ScrollView를 데이터로 채우고 아래쪽으로 스크롤하고 싶습니다.

나는 getScrollView().fullScroll(ScrollView.FOCUS_DOWN). 이것은 버튼 클릭에 대한 작업으로 만들 때 작동하지만 onCreate 메서드에서는 작동하지 않습니다.

활동 시작시 ScrollView를 맨 아래로 스크롤하는 방법이 있습니까? 이는보기가 처음 표시 될 때 이미 맨 아래로 스크롤되었음을 의미합니다.


이것은 또한 ScrollView의 자체 하위 클래스를 초기화하는 동안 getMeasuredWidth를 사용하려고 할 때 항상 0을 얻는 이유를 설명합니다.
Ghoti

답변:


218

다음과 같이 수행해야합니다.

    getScrollView().post(new Runnable() {

        @Override
        public void run() {
            getScrollView().fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

이렇게하면보기가 먼저 업데이트 된 다음 "새"맨 아래로 스크롤됩니다.


1
나는 이것을 정확하게 시도하고 있지만 여전히 작동하지 않는 것 같습니다 ... 위의 코드를 onCreate포함하고 Activity있습니까?
pstanton 2011

나는 ONSTART로하고 있습니다
팔로

4
대신 post ()는 100ms 지연으로 postDelayed ()를 사용합니다. 모든 활동 수명주기 지점에서 작동합니다.
Vitaliy A

50

데이터가 추가 된 후 다음 코드를 넣으십시오.

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

4
나를 위해 이것은 postDelayed 대신 postDelayed에서만 작동했습니다. 100 밀리 초 만 지연됩니다.
Andreas Rudolph

완전한. 물론 scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra

30

이것은 나를 위해 작동합니다.

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});

2
지금까지이 질문에 대한 최고의 답변입니다. 다른 많은 접근 방식은 조건부이지만 이것은 굉장합니다 n은 매우 잘 작동합니다 :)
rana

17

레이아웃 파일에서이 작업을 수행 할 수 있습니다.

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">

8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);

4

이 시도

    final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
    scrollview.post(new Runnable() {
       @Override
       public void run() {
         scrollview.fullScroll(ScrollView.FOCUS_DOWN);
       }
    });

3

뷰에 데이터를 추가 한 직후 다음 한 줄을 추가합니다.

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

UI 구성 요소를 초기화하고 데이터로 채 웁니다. on create 메서드에 해당 줄을 추가하십시오.

Runnable runnable=new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    };
    scrollView.post(runnable);

1

이것이 가장 좋은 방법입니다.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.