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

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

9 ответов

Решение

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

findViewById(android.R.id.content)

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

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

вместо.

Обратите внимание, что, как сообщил Booger, это может быть за панелью навигации (с кнопкой "Назад" и т. Д.) На некоторых устройствах (но на большинстве устройств это не так).

Если вам нужно получить представление о том, что вы добавили в свою деятельность, используя setContentView() метод, то, как написал pottedmeat, вы можете использовать

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

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

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

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

Я проверял это в 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();

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

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

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

Kotlin Extension Solution

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

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

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

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

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

View rootView = dataBinding.getRoot();

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

val rootView = dataBinding.root

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

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

в любом onClick мы будем получать "View view", с помощью "view" получить rootView.

View view = view.getRootView ();

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

View view = FragmentClass.getView();

Еще одно решение Kotlin Extension

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

android:id="@+id/root_activity"

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

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

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

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

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

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

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

getWindow().getDecorView();

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

Другие вопросы по тегам