วิธีเลื่อนไปด้านล่างใน ScrollView เมื่อเริ่มต้นกิจกรรม


96

ฉันกำลังแสดงข้อมูลบางอย่างใน ScrollView ในการเริ่มต้นกิจกรรม (วิธีการ onCreate) ฉันกรอกข้อมูลใน ScrollView และต้องการเลื่อนลงไปด้านล่าง

ฉันพยายามที่จะใช้getScrollView().fullScroll(ScrollView.FOCUS_DOWN). สิ่งนี้ใช้ได้ผลเมื่อฉันทำเป็นแอคชั่นเมื่อคลิกปุ่ม แต่ใช้ไม่ได้ในเมธอด onCreate

มีวิธีใดในการเลื่อน ScrollView ไปที่ด้านล่างเมื่อเริ่มต้นกิจกรรมหรือไม่? นั่นหมายความว่ามุมมองถูกเลื่อนไปด้านล่างแล้วเมื่อแสดงครั้งแรก


นอกจากนี้ยังอธิบายว่าเหตุใดฉันจึงได้รับ 0 ตลอดเวลาเมื่อฉันพยายามใช้ getMeasuredWidth ในขณะที่เริ่มต้นคลาสย่อยของ ScrollView
Ghoti

คำตอบ:


218

จะต้องดำเนินการดังต่อไปนี้:

    getScrollView().post(new Runnable() {

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

วิธีนี้จะอัปเดตมุมมองก่อนจากนั้นเลื่อนไปที่ด้านล่าง "ใหม่"


1
ฉันกำลังพยายามอย่างเต็มที่ แต่ดูเหมือนจะไม่ได้ผล ... คุณกำลังเรียกรหัสด้านบนในonCreateบรรจุภัณฑ์Activityหรือไม่
pstanton

ฉันกำลังทำใน onStart
Palo

4
แทนที่จะโพสต์ () ใช้ postDelayed () ที่มีความล่าช้า 100ms มันจะทำงานจากจุดวงจรชีวิตของกิจกรรมใด ๆ
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 แทนการโพสต์ ล่าช้าเพียง 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
คำตอบที่ดีที่สุดสำหรับคำถามนี้จนถึงตอนนี้ วิธีอื่น ๆ มากมายมีเงื่อนไข แต่วิธีนี้ยอดเยี่ยมและใช้งานได้ดีสุด ๆ :)
rana

17

คุณสามารถทำได้ในไฟล์เลย์เอาต์:

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


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 ของคุณและกรอกข้อมูล เพิ่มบรรทัดเหล่านั้นในวิธีการสร้างของคุณ

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.