Отримайте перегляд коренів із поточної активності


633

Я знаю, як отримати перегляд кореня за допомогою View.getRootView () . Я також можу отримати подання з onClickподії кнопки, де аргументом є Вид . Але як я можу отримати погляд у діяльності ?


3
У процесі діяльності ви зазвичай повідомляєте, який ресурс він повинен відображати, setContentView()а представлений вами вигляд - це вже корінь. Якщо вам потрібна ручка цього виду, просто поставте ідентифікатор до нього в XAML і findViewById()все буде добре.
xandy

Мій план полягає в тому, щоб приєднувати код динамічно .. тому якщо мої користувачі використовують api, я очікую, що він автоматично виявить речі. Рішення Боулдера працює!
Ліліт

4
@xandy: незначна помилка: XAML -> XML.
superjos

Відповіді:


1048

Якщо вам потрібен перегляд кореневої діяльності (ви можете додати свій вміст туди), використовуйте

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

Також повідомлялося, що на деяких пристроях вам доведеться користуватися

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

замість цього.

Зауважте, що, як повідомляв Booger, на деяких пристроях це може бути поза навігаційною панеллю (із кнопкою "назад" тощо) (але на більшості пристроїв це здається, що це не так).

Якщо вам потрібно переконатися, що ви додали до своєї діяльності setContentView()методом, тоді, як написано м'ясо в горщиках, ви можете використовувати

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

Але краще просто встановити ідентифікатор для цього виду у своєму форматі xml та використовувати його замість цього.


194
Насправді просто findViewById (android.R.id.content) дає мені кореневий вигляд. Якщо це не відповідає дійсності, я можу отримати корінний вигляд із findViewById (android.R.id.content) .getRootView (). Дякую за відповідь. Де я можу дізнатися більше про речі на android.R? Я цього не знав.
Ліліт

4
Ви можете перевірити тут, я думаю, що developer.android.com/reference/android/R.html Це просто посилання на ресурси Android. Особисто я дізнався про android.R.id.content, а потім перевіряв макети в ієрархічному переглядачі.
Дмитро Рядненко

14
Я помітив, що, як видається, цей вигляд включає в себе рядок стану, тому якщо ви шукаєте видиму частину вашої діяльності, використовуйте відповідь від @pottedmeat.
Бен Клейтон

5
@Lalith, чи можете ви детальніше розібратися, коли потрібно було знайти findViewById (android.R.id.content) .getRootView ()? Загальне правило було б дуже корисно знати.
батбрат

2
@batbrat Мені потрібно використовувати .getRootView () в Android 5.0+, коли я використовую панель дій
Morten Holmgaard

264

Це те, що я використовую для отримання подання кореня, як знайдено у файлі XML, призначеному setContentView:

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

33
Ця відповідь дала перегляд без рядка статусу - чого я хотів. Я шукав піксельну ширину + висоту видимої частини діяльності. Цей працює, дякую!
Бен Клейтон

9
Це виключає ActionBar!
Уейн

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. Це найпростіший спосіб і найменша кількість коду, який я знайшов.
Олівер Діксон

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();

Щоб отримати сертифікаційний вигляд діяльності, наприклад imageView усередині діяльності, просто додайте ідентифікатор цього виду, який ви хочете отримати:

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

Якщо ви хочете додати те саме для фрагментів для послідовності, додайте:

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

1

щоб отримати Перегляд поточної активності

в будь-якому onClick ми отримаємо "Перегляд подання", використовуючи "view" отримати rootView.

View view = view.getRootView ();

і отримати View у фрагменті

View view = 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
Едгар Хіміч,


0

Ще одне рішення розширення Kotlin

Якщо подання вашої діяльності оголошено в xml (наприклад activity_root.xml), відкрийте xml та призначте ідентифікатор кореневому виду:

android:id="@+id/root_activity"

Тепер у вашому класі імпортуйте представлення, використовуючи:

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

Тепер ви можете використовувати root_activityяк перегляд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.