ผมรู้ว่าจะได้รับมุมมองรากกับView.getRootView () ฉันยังสามารถที่จะได้รับมุมมองจากปุ่มของonClick
เหตุการณ์ที่อาร์กิวเมนต์เป็นดู แต่ฉันจะดูในกิจกรรมได้อย่างไร
ผมรู้ว่าจะได้รับมุมมองรากกับView.getRootView () ฉันยังสามารถที่จะได้รับมุมมองจากปุ่มของonClick
เหตุการณ์ที่อาร์กิวเมนต์เป็นดู แต่ฉันจะดูในกิจกรรมได้อย่างไร
คำตอบ:
หากคุณต้องการมุมมองรูทของกิจกรรมของคุณ (เพื่อให้คุณสามารถเพิ่มเนื้อหาของคุณที่นั่น) ใช้
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 นี้แทน
นี่คือสิ่งที่ฉันใช้เพื่อรับมุมมองรูทตามที่พบในไฟล์ XML ที่กำหนดด้วยsetContentView
:
final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
ActionBar
หรือไม่
ฉันทดสอบสิ่งนี้ใน 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@#######
กรุณายืนยัน.
ภายในกิจกรรมของเราเราสามารถรับroot
มุมมองด้วย:
ViewGroup rootView = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
หรือ
View rootView = getWindow().getDecorView().getRootView();
ใน Kotlin เราทำได้สั้นกว่านี้เล็กน้อย:
val rootView = window.decorView.rootView
เพียงใส่คนที่ต้องการวิธีที่ง่ายกว่า:
รหัสต่อไปนี้ให้มุมมองของกิจกรรมทั้งหมด:
View v1 = getWindow().getDecorView().getRootView();
ในการรับมุมมอง certian ในกิจกรรมตัวอย่างเช่น imageView ภายในกิจกรรมเพียงเพิ่ม id ของมุมมองนั้นที่คุณต้องการรับ:
View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);
หวังว่านี่จะช่วยใครซักคน
findViewById(R.id.imageView1);
กิจกรรมหากคุณต้องการมุมมองที่เฉพาะเจาะจง
anyview.getRootView();
จะเป็นวิธีที่ง่ายที่สุด
ใช้สิ่งนี้เพื่อทำให้การเข้าถึงในกิจกรรมง่ายขึ้น จากนั้นคุณสามารถอ้างอิงโดยตรงrootView
จากกิจกรรมหรือactivity.rootView
ภายนอก:
val Activity.rootView get() = window.decorView.rootView
หากคุณต้องการเพิ่มแบบเดียวกันสำหรับ Fragments เพื่อความสอดคล้องให้เพิ่ม:
val Fragment.rootView get() = view?.rootView
เพื่อรับมุมมองของกิจกรรมปัจจุบัน
ใน onClick ใด ๆ เราจะได้รับ "มุมมองมุมมอง" โดยใช้ 'มุมมอง' รับรูทวิว
View view = view.getRootView ();
และเพื่อรับ View in fragment
มุมมอง = FragmentClass.getView ();
หากคุณอยู่ในกิจกรรมสมมติว่ามีเพียงหนึ่งมุมมองรูทคุณสามารถได้รับเช่นนี้
ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
จากนั้นคุณสามารถส่งไปยังชั้นเรียนจริงของคุณ
หรือคุณสามารถใช้
getWindow().getDecorView();
แจ้งให้ทราบล่วงหน้าซึ่งจะรวมถึงมุมมองแอ็คชั่นบาร์มุมมองของคุณอยู่ด้านล่างมุมมองแอคชั่น
Activity
ชั้นเรียน
สำหรับบรรดาของคุณที่กำลังใช้Data Binding Libraryเพื่อรับรูทของกิจกรรมปัจจุบันเพียงใช้:
View rootView = dataBinding.getRoot();
และสำหรับผู้ใช้ Kotlin มันง่ายกว่ามาก:
val rootView = dataBinding.root
หากมุมมองของกิจกรรมของคุณถูกประกาศใน xml (เช่นactivity_root.xml
) ให้เปิด xml และกำหนดรหัสให้กับมุมมองรูต:
android:id="@+id/root_activity"
ในชั้นเรียนของคุณให้นำเข้ามุมมองโดยใช้:
import kotlinx.android.synthetic.main.activity_root.root_activity
ตอนนี้คุณสามารถใช้root_activity
เป็นมุมมอง
setContentView()
และมุมมองที่คุณให้ไว้เป็นรูตแล้ว หากคุณต้องการหมายเลขอ้างอิงของมุมมองนั้นเพียงแค่ใส่ ID ลงใน XAML และfindViewById()
จะใช้ได้