Получить корневой вид из текущей активности

634

Я знаю, как получить корневой вид с помощью View.getRootView () . Я также возможность получить вид с помощью кнопки в onClickслучае , когда аргумент является View . Но как я могу получить представление в деятельности ?

Лалитх
источник
3
В действии, как правило, вы указываете, какой ресурс он должен использовать, setContentView()и представленное вами представление уже является корневым. Если вам нужен дескриптор этого представления, просто добавьте к нему идентификатор в XAML, и findViewById()все будет в порядке.
xandy
Мой план состоит в том, чтобы прикрепить код динамически ... поэтому, если мои пользователи используют API, я ожидаю, что он будет автоматически обнаруживать вещи ... Решение Boulder работает!
Лалит
4
@xandy: небольшая опечатка: XAML -> XML.
Superjos

Ответы:

1048

Если вам нужен root вид вашей активности (чтобы вы могли добавить туда свой контент) используйте

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

Но лучше просто установить идентификатор для этого представления в макете XML и использовать вместо этого идентификатор.

Дмитрий Рядненко
источник
194
На самом деле, просто findViewById (android.R.id.content) дает мне корневое представление. Если это не так в некоторых случаях, я могу получить представление root от 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+ при использовании панели действий
Мортен Холмгаард
264

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

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
pottedmeat
источник
33
Этот ответ дал представление без строки состояния - что я и хотел. Я искал ширину пикселя + высоту видимой части действия. Это работает, спасибо!
Бен Клейтон
9
Это исключает ActionBar!
Уэйн
4
Есть ли способ включить ActionBarтакже?
theblang
3
Ключевыми словами здесь являются «корневой вид, найденный в файле XML». Спасибо.
Кейси
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();
Jorgesys
источник
20

В Kotlin мы можем сделать это немного короче:

val rootView = window.decorView.rootView
Артем Ботнев
источник
19

Просто, если кому-то нужен более простой способ:

Следующий код дает представление о всей деятельности:

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

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

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

Надеюсь, это кому-нибудь поможет

Салах Кляйн
источник
5
Вы можете просто вызвать findViewById(R.id.imageView1);активность, если хотите конкретный вид.
RobCo
3

anyview.getRootView(); будет самый простой способ.

Khemraj
источник
2

Решение по расширению Kotlin

Используйте это, чтобы упростить доступ в Деятельности. Тогда вы можете напрямую ссылаться rootViewна активность или activity.rootViewвне ее:

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

Если вы хотите добавить то же самое для фрагментов для согласованности, добавьте:

val Fragment.rootView get() = view?.rootView
Gibolt
источник
1

получить вид текущей деятельности

в любом onClick мы будем получать «View view», используя «view» получить rootView.

View view = view.getRootView ();

и получить View во фрагменте

View view = FragmentClass.getView ();

user3509903
источник
0

если вы находитесь в упражнении, предположим, что есть только одно корневое представление, вы можете получить его следующим образом.

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

Затем вы можете привести его в свой реальный класс

или вы могли бы использовать

getWindow().getDecorView();

обратите внимание, что это будет включать в себя вид панели действий, ваш вид ниже представления панели действий

лучник хан
источник
В Activityклассе нет такого метода .
onelaview
window.decorView или window.decorView как ViewGroup - если вам нужно привести его к ViewGroup
Эдгар Химич
0

Для тех из вас, кто использует библиотеку привязки данных , чтобы получить корень текущей активности, просто используйте:

View rootView = dataBinding.getRoot();

А для пользователей Kotlin это еще проще:

val rootView = dataBinding.root
Алекс Мамо
источник
0

Еще одно решение для расширения Kotlin

Если представление вашей активности объявлено в xml (ex activity_root.xml), откройте xml и назначьте id для корневого представления:

android:id="@+id/root_activity"

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

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

Теперь вы можете использовать root_activityв качестве представления.

smac89
источник