Aktivite başlangıcında bir ScrollView'da aşağıya nasıl kaydırılır


96

ScrollView'da bazı veriler görüntülüyorum. Etkinlik başlangıcında (onCreate yöntemi) ScrollView'ı verilerle dolduruyorum ve en alta kaydırmak istiyorum.

Kullanmaya çalıştım getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Bu, düğme tıklandığında bir eylem yaptığımda çalışıyor ancak onCreate yönteminde çalışmıyor.

Aktivite başlangıcında ScrollView'ı aşağıya kaydırmanın bir yolu var mı? Bu, görünümün ilk kez görüntülendiğinde zaten en alta kaydırıldığı anlamına gelir.


Bu ayrıca, bir ScrollView'ın kendi alt sınıfımı başlatırken getMeasuredWidth'i kullanmaya çalışırken neden sürekli 0 aldığımı da açıklıyor.
Ghoti

Yanıtlar:


218

Aşağıdaki gibi yapılması gerekiyor:

    getScrollView().post(new Runnable() {

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

Bu şekilde görünüm önce güncellenir ve ardından "yeni" alt kısma kaydırılır.


1
Tam olarak bunu deniyorum ama hala işe yaramıyor gibi görünüyor ... yukarıdaki kodu onCreateiçeren içinde Activitymi arıyorsunuz?
pstanton

Bunu onStart'ta yapıyorum
Palo

4
Bunun yerine post () 100 ms gecikmeli postDelayed () kullanın. herhangi bir faaliyetin yaşam döngüsü noktasından çalışacaktır.
Vitaliy A

50

Verileriniz eklendikten sonra aşağıdaki kodu girin:

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

4
Benim için bu sadece gönderi yerine bir gönderi ile çalıştı. Sadece 100 milisaniye gecikme.
Andreas Rudolph

Mükemmel. Elbette scrollview.fullScroll (ScrollView.FOCUS_UP) ile combo ile;
ieselisra

30

Bu benim için çalışıyor:

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

2
Bu soru için şimdiye kadarki en iyi cevap. Diğer birçok yaklaşım koşullu ancak bu harika n çok iyi çalışıyor :)
rana

17

Bunu düzen dosyasında yapabilirsiniz:

                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

Bunu dene

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

3

Verileri görünüme ekledikten hemen sonra şu tek satırı ekleyin:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

UI bileşeninizi başlattıktan ve verilerle doldurduktan sonra. bu satırı oluşturma yönteminize ekleyin

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

1

Bunu yapmanın en iyi yolu budur.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.