Dapatkan tampilan root dari aktivitas saat ini

634

Saya tahu cara mendapatkan tampilan root dengan View.getRootView () . Saya juga bisa mendapatkan tampilan dari acara tombol di onClickmana argumennya adalah Tampilan . Tetapi bagaimana saya bisa mendapatkan tampilan dalam suatu kegiatan ?

Lalith
sumber
3
Dalam aktivitas, biasanya Anda memberi tahu sumber daya mana yang harus diolah setContentView()dan pandangan yang Anda berikan sudah menjadi root. Jika Anda perlu menangani tampilan itu, cukup masukkan ID di XAML dan findViewById()akan baik-baik saja.
xandy
Rencana saya adalah melampirkan kode secara dinamis .. jadi jika pengguna saya menggunakan api, saya berharap untuk secara otomatis mendeteksi hal-hal .. Solusi Boulder bekerja!
Lalith
4
@xandy: salah ketik: XAML -> XML.
superjos

Jawaban:

1048

Jika Anda membutuhkan tampilan root dari aktivitas Anda (sehingga Anda dapat menambahkan konten Anda di sana) gunakan

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

Juga dilaporkan bahwa pada beberapa perangkat Anda harus menggunakan

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

sebagai gantinya.

Harap perhatikan bahwa seperti yang dilaporkan Booger, ini mungkin berada di belakang bilah navigasi (dengan tombol kembali dll.) Pada beberapa perangkat (tetapi tampaknya pada sebagian besar perangkat tidak).

Jika Anda perlu mendapatkan tampilan yang Anda tambahkan ke aktivitas Anda menggunakan setContentView()metode maka sebagai pottedmeat menulis Anda dapat menggunakan

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

Tetapi lebih baik atur id ke tampilan ini di layout xml Anda dan gunakan id ini sebagai gantinya.

Dmitry Ryadnenko
sumber
194
Sebenarnya hanya findViewById (android.R.id.content) yang memberi saya tampilan root. Jika itu tidak benar dalam beberapa kasus saya bisa mendapatkan tampilan root dari findViewById (android.R.id.content) .getRootView (). Terima kasih atas jawabannya. Di mana saya bisa belajar lebih banyak tentang hal-hal android.R? Saya tidak menyadarinya.
Lalith
4
Anda dapat memeriksa di sini saya kira developer.android.com/reference/android/R.html Ini hanya referensi sumber daya android. Secara pribadi saya belajar tentang android.R.id.content kemudian memeriksa layout di hierarchyviewer.
Dmitry Ryadnenko
14
Saya perhatikan bahwa tampilan ini tampaknya menyertakan bilah status, jadi jika Anda mencari bagian yang terlihat dari aktivitas Anda, gunakan jawaban dari @pottedmeat.
Ben Clayton
5
@Lalith, dapatkah Anda menguraikan kapan Anda perlu melakukan findViewById (android.R.id.content) .getRootView ()? Aturan umum akan sangat berguna untuk diketahui.
batbrat
2
@batbrat Saya perlu menggunakan .getRootView () di Android 5.0+ saat menggunakan action bar
Morten Holmgaard
264

Ini yang saya gunakan untuk mendapatkan tampilan root seperti yang ditemukan dalam file XML yang ditugaskan setContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
daging pot
sumber
33
Jawaban ini memberikan tampilan tanpa bilah status - yang saya inginkan. Saya mencari lebar piksel + tinggi bagian yang terlihat dari aktivitas. Yang ini berhasil, terima kasih!
Ben Clayton
9
Ini tidak termasuk ActionBar!
Wayne
4
Apakah ada cara untuk memasukkannya ActionBarjuga?
theblang
3
Kata-kata kunci di sini adalah "tampilan root seperti yang ditemukan dalam file XML". Terima kasih.
Kacy
3
Ini harus menjadi jawaban bertanda yang benar. Ini akan menempatkan Snackbar di dalam Aktivitas Anda (di root), di mana seharusnya (Saya cukup yakin tidak ada yang ingin menempatkan informasi mereka di balik Tombol Nav)
Booger
136

Saya menguji ini di android 4.0.3, hanya:

getWindow().getDecorView().getRootView()

berikan pandangan yang sama dari apa yang kita dapatkan

anyview.getRootView();

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

dan

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

memberi anak itu

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

Mohon konfirmasi.

Sudar Nimalan
sumber
5
Android2.3.3 tampak sama
ruX
2
Bekerja di 4.3 Adalah cara termudah dan jumlah kode paling sedikit yang saya temukan.
Oliver Dixon
10
Terbaik jika Anda menggunakan SnackBar
zackygaurav
getWindow (). getDecorView (). getRootView (). getHeight () mengembalikan ketinggian tampilan.
vovahost
3
getWindow (). getDecorView (). getRootView () tidak disarankan untuk snack bar, itu akan tumpang tindih dengan bar navigasi sistem, findViewById (android.R.id.content) akan lebih baik.
thanhbinh84
31

Dapatkan tampilan root dari aktivitas saat ini.

Di dalam aktivitas kami, kami dapat rootmelihat:

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

atau

View rootView = getWindow().getDecorView().getRootView();
Jorgesys
sumber
20

Di Kotlin kita bisa melakukannya sedikit lebih pendek:

val rootView = window.decorView.rootView
Artem Botnev
sumber
19

Hanya memetikan Seseorang membutuhkan cara yang lebih mudah:

Kode berikut memberikan pandangan tentang seluruh aktivitas:

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

Untuk mendapatkan tampilan yang pasti dalam aktivitas, misalnya imageView di dalam aktivitas, cukup tambahkan id dari tampilan yang ingin Anda dapatkan:

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

Semoga ini bisa membantu seseorang

Salah Klein
sumber
5
Anda bisa memanggil findViewById(R.id.imageView1);aktivitas jika Anda ingin tampilan tertentu.
RobCo
3

anyview.getRootView(); akan menjadi cara termudah.

Khemraj
sumber
2

Solusi Ekstensi Kotlin

Gunakan ini untuk menyederhanakan akses dalam suatu Kegiatan. Kemudian Anda dapat merujuk langsung rootViewdari Aktivitas, atau di activity.rootViewluarnya:

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

Jika Anda ingin menambahkan yang sama untuk Fragmen untuk konsistensi, tambahkan:

val Fragment.rootView get() = view?.rootView
Gibolt
sumber
1

untuk mendapatkan Tampilan Aktivitas saat ini

di onClick manapun kita akan mendapatkan "View view", dengan menggunakan 'view' get the rootView.

Lihat tampilan = view.getRootView ();

dan untuk mendapatkan View secara terpisah

Lihat tampilan = FragmentClass.getView ();

pengguna3509903
sumber
0

jika Anda berada dalam suatu kegiatan, anggap hanya ada satu tampilan root, Anda bisa mendapatkannya seperti ini.

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

Anda kemudian dapat melemparkannya ke kelas Anda yang sebenarnya

atau Anda bisa menggunakan

getWindow().getDecorView();

perhatikan ini akan mencakup tampilan actionbar, tampilan Anda di bawah tampilan actionbar

bowman han
sumber
Tidak ada metode seperti itu di Activitykelas.
onelaview
window.decorView atau window.decorView sebagai ViewGroup - jika Anda perlu melemparkannya ke ViewGroup
Edgar Khimich
0

Bagi Anda yang menggunakan Perpustakaan Binding Data , untuk mendapatkan root dari aktivitas saat ini, cukup gunakan:

View rootView = dataBinding.getRoot();

Dan untuk pengguna Kotlin, itu bahkan lebih sederhana:

val rootView = dataBinding.root
Alex Mamo
sumber
0

Solusi Ekstensi Kotlin lainnya

Jika tampilan aktivitas Anda dinyatakan dalam xml (ex activity_root.xml), buka xml dan berikan id ke tampilan root:

android:id="@+id/root_activity"

Sekarang di kelas Anda, impor tampilan menggunakan:

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

Anda sekarang dapat menggunakan root_activitysebagai tampilan.

smac89
sumber