รับมุมมองรูตจากกิจกรรมปัจจุบัน


633

ผมรู้ว่าจะได้รับมุมมองรากกับView.getRootView () ฉันยังสามารถที่จะได้รับมุมมองจากปุ่มของonClickเหตุการณ์ที่อาร์กิวเมนต์เป็นดู แต่ฉันจะดูในกิจกรรมได้อย่างไร


3
ในกิจกรรมโดยปกติคุณจะบอกว่าควรใช้การแสดงผลแบบใดsetContentView()และมุมมองที่คุณให้ไว้เป็นรูตแล้ว หากคุณต้องการหมายเลขอ้างอิงของมุมมองนั้นเพียงแค่ใส่ ID ลงใน XAML และfindViewById()จะใช้ได้
xandy

แผนของฉันคือการแนบรหัสแบบไดนามิก .. ดังนั้นหากผู้ใช้ของฉันใช้ api ฉันคาดหวังว่ามันจะตรวจจับสิ่งต่าง ๆ โดยอัตโนมัติ .. โซลูชันของ Boulder ใช้งานได้!
Lalith

4
@xandy: การพิมพ์ผิดเล็กน้อย: XAML -> XML
superjos

คำตอบ:


1048

หากคุณต้องการมุมมองรูทของกิจกรรมของคุณ (เพื่อให้คุณสามารถเพิ่มเนื้อหาของคุณที่นั่น) ใช้

findViewById(android.R.id.content).getRootView()

นอกจากนี้ยังมีรายงานว่าในอุปกรณ์บางอย่างที่คุณต้องใช้

getWindow().getDecorView().findViewById(android.R.id.content)

แทน.

โปรดทราบว่าตามที่ Booger รายงานสิ่งนี้อาจอยู่ด้านหลังแถบนำทาง (พร้อมปุ่มย้อนกลับและอื่น ๆ ) ในบางอุปกรณ์ (แต่ดูเหมือนว่าในอุปกรณ์ส่วนใหญ่จะไม่มี)

หากคุณต้องการดูว่าคุณเพิ่มไปยังกิจกรรมของคุณโดยใช้setContentView()วิธีการแล้วตามที่ pottedmeat เขียนคุณสามารถใช้

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

แต่ควรตั้งค่า id เป็นมุมมองนี้ในเค้าโครง xml ของคุณและใช้ id นี้แทน


194
ที่จริงแค่ findViewById (android.R.id.content) กำลังให้มุมมองรูตแก่ฉัน หากไม่เป็นจริงในบางกรณีฉันสามารถรับรูทวิวจาก findViewById (android.R.id.content) .getRootView () ขอบคุณสำหรับคำตอบ. ฉันจะเรียนรู้เพิ่มเติมเกี่ยวกับอุปกรณ์ android.R ได้ที่ไหน? ฉันไม่รู้
Lalith

4
คุณสามารถตรวจสอบที่นี่ฉันคิดว่าdeveloper.android.com/reference/android/R.htmlมันเป็นเพียงการอ้างอิงทรัพยากร Android ส่วนตัวฉันเรียนรู้เกี่ยวกับ android.R.id.content จากนั้นตรวจสอบเค้าโครงใน hierarchyviewer
Dmitry Ryadnenko

14
ฉันสังเกตเห็นว่ามุมมองนี้ดูเหมือนจะรวมแถบสถานะดังนั้นหากคุณกำลังมองหาส่วนที่มองเห็นได้ของกิจกรรมของคุณให้ใช้คำตอบจาก @pottedmeat
เบ็นเคลย์ตัน

5
@Lalith คุณสามารถอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับ findViewById (android.R.id.content) .getRootView () ได้ไหม? กฎทั่วไปจะมีประโยชน์จริง ๆ ที่จะรู้
batbrat

2
@batbrat ฉันจำเป็นต้องใช้. getRootView () ใน Android 5.0+ เมื่อใช้แถบแอ็คชั่

264

นี่คือสิ่งที่ฉันใช้เพื่อรับมุมมองรูทตามที่พบในไฟล์ XML ที่กำหนดด้วยsetContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

33
คำตอบนี้ให้มุมมองโดยไม่มีแถบสถานะ - ซึ่งเป็นสิ่งที่ฉันต้องการ ฉันกำลังค้นหาความกว้างพิกเซล + ความสูงของส่วนที่มองเห็นได้ของกิจกรรม อันนี้ใช้ได้ดีขอบคุณ!
Ben Clayton

9
สิ่งนี้ไม่รวม ActionBar!
Wayne

4
มีวิธีรวมActionBarหรือไม่
theblang

3
คำสำคัญที่นี่คือ "มุมมองรูตที่พบในไฟล์ XML" ขอบคุณ.
Kacy

3
นี่ควรเป็นคำตอบที่ถูกต้อง นี่จะวาง Snackbar ไว้ในกิจกรรมของคุณ (ที่รูท) ซึ่งเป็นที่ที่ควรจะเป็น (ฉันค่อนข้างมั่นใจว่าไม่มีใครต้องการที่จะวางข้อมูลของพวกเขาไว้ข้างหลังปุ่ม Nav)
Booger

136

ฉันทดสอบสิ่งนี้ใน android 4.0.3 เท่านั้น:

getWindow().getDecorView().getRootView()

ให้มุมมองเดียวกันกับสิ่งที่เราได้รับจาก

anyview.getRootView();

com.android.internal.policy.impl.PhoneWindow$DecorView@#########

และ

getWindow().getDecorView().findViewById(android.R.id.content)

ให้ลูกของมัน

android.widget.FrameLayout@#######

กรุณายืนยัน.


5
Android2.3.3 ดูเหมือนกัน
ruX

2
ใช้งานได้ใน 4.3 เป็นวิธีที่ง่ายที่สุดและฉันพบรหัสน้อยที่สุด
Oliver Dixon

10
ดีที่สุดถ้าคุณใช้ SnackBar
zackygaurav

getWindow (). getDecorView (). getRootView (). getHeight ()ส่งคืนความสูงของหน้าจอ
vovahost

3
getWindow (). getDecorView (). getRootView () ไม่แนะนำสำหรับสแน็คบาร์มันจะซ้อนทับแถบนำทางของระบบ findViewById (android.R.id.content) จะดีกว่า
thanhbinh84

31

รับมุมมองรูตจากกิจกรรมปัจจุบัน

ภายในกิจกรรมของเราเราสามารถรับrootมุมมองด้วย:

ViewGroup rootView = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

หรือ

View rootView = getWindow().getDecorView().getRootView();


19

เพียงใส่คนที่ต้องการวิธีที่ง่ายกว่า:

รหัสต่อไปนี้ให้มุมมองของกิจกรรมทั้งหมด:

View v1 = getWindow().getDecorView().getRootView();

ในการรับมุมมอง certian ในกิจกรรมตัวอย่างเช่น imageView ภายในกิจกรรมเพียงเพิ่ม id ของมุมมองนั้นที่คุณต้องการรับ:

View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);

หวังว่านี่จะช่วยใครซักคน


5
คุณสามารถโทรหาfindViewById(R.id.imageView1);กิจกรรมหากคุณต้องการมุมมองที่เฉพาะเจาะจง
RobCo


2

โซลูชั่นเสริม Kotlin

ใช้สิ่งนี้เพื่อทำให้การเข้าถึงในกิจกรรมง่ายขึ้น จากนั้นคุณสามารถอ้างอิงโดยตรงrootViewจากกิจกรรมหรือactivity.rootViewภายนอก:

val Activity.rootView get() = window.decorView.rootView

หากคุณต้องการเพิ่มแบบเดียวกันสำหรับ Fragments เพื่อความสอดคล้องให้เพิ่ม:

val Fragment.rootView get() = view?.rootView

1

เพื่อรับมุมมองของกิจกรรมปัจจุบัน

ใน onClick ใด ๆ เราจะได้รับ "มุมมองมุมมอง" โดยใช้ 'มุมมอง' รับรูทวิว

View view = view.getRootView ();

และเพื่อรับ View in fragment

มุมมอง = FragmentClass.getView ();


0

หากคุณอยู่ในกิจกรรมสมมติว่ามีเพียงหนึ่งมุมมองรูทคุณสามารถได้รับเช่นนี้

ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
        .findViewById(android.R.id.content)).getChildAt(0);

จากนั้นคุณสามารถส่งไปยังชั้นเรียนจริงของคุณ

หรือคุณสามารถใช้

getWindow().getDecorView();

แจ้งให้ทราบล่วงหน้าซึ่งจะรวมถึงมุมมองแอ็คชั่นบาร์มุมมองของคุณอยู่ด้านล่างมุมมองแอคชั่น


ไม่มีวิธีการดังกล่าวในActivityชั้นเรียน
onelaview

window.decorView หรือ window.decorView เป็น ViewGroup - หากคุณต้องการส่งไปยัง ViewGroup
Edgar Khimich

0

สำหรับบรรดาของคุณที่กำลังใช้Data Binding Libraryเพื่อรับรูทของกิจกรรมปัจจุบันเพียงใช้:

View rootView = dataBinding.getRoot();

และสำหรับผู้ใช้ Kotlin มันง่ายกว่ามาก:

val rootView = dataBinding.root

0

โซลูชัน Kotlin Extension อื่น

หากมุมมองของกิจกรรมของคุณถูกประกาศใน xml (เช่นactivity_root.xml) ให้เปิด xml และกำหนดรหัสให้กับมุมมองรูต:

android:id="@+id/root_activity"

ในชั้นเรียนของคุณให้นำเข้ามุมมองโดยใช้:

import kotlinx.android.synthetic.main.activity_root.root_activity

ตอนนี้คุณสามารถใช้root_activityเป็นมุมมอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.