アクティビティの開始時に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
私にとって、これはpostではなくpostDelayedでのみ機能しました。わずか100ミリ秒の遅延。
Andreas Rudolph

完璧です。もちろん、scrollview.fullScroll(ScrollView.FOCUS_UP);とのコンボを使用します。
ieselisra 2015年

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

ビューにデータを追加した直後に、次の1行を追加します。

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.