Как получить вид деятельности Activity?

279

Какой метод мне следует вызвать, чтобы узнать, есть ли у Activity свой contentView (после вызова метода setContentView () )?

Teoretik
источник

Ответы:

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

или

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

или

this.findViewById(android.R.id.content).getRootView()
Эрнест
источник
4
или getWindow().findViewById(android.R.id.content):)
Алекс Локвуд
1
это работает нормально, если дело касается извлечения родительского представления ... BUt..если я пытаюсь this.findViewById (android.R.id.content) .setBackgroundDrawable (d); это не работает .. Можете ли вы предложить .. Спасибо заранее
Раджеш Вадхва
3
Если вы устанавливаете макет из XML с использованием setContentView(R.layout.my_view), это возвращает родителя этого макета.
Джей Лиеске
Здравствуйте, @ernest У меня такой вопрос, как если бы в моем макете у меня было одно изображение сверху, чем две вкладки в панели вкладок. и в нижней части SatelliteMenu, хотите сделать размытие по пунктам меню.
Девендра Сингх
1
контент не существует для Android.Resource.Id.
Джастин,
23

Вы можете получить вид назад, если вы добавите идентификатор в свой макет.

<RelativeLayout
    android:id="@+id/my_relative_layout_id"

И вызвать его из findViewById ...

papachan
источник
Это самый надежный способ получить рут установленного макета.
Джей Лиеске
3
На что вы переходите findViewById?
транс
1
@trans View contentView = findViewById (R.id.my_relative_layout_id);
Джастин Лю
11

Как насчет

View view = Activity.getCurrentFocus();
Майк Джонс
источник
Как это не имеет больше пальцы вверх? Прекрасно работает!
Aeskreis
1
@aeskreis, потому что в моем случае это возвращает нульcurrentFocus?.let { ... }
user924
10

Вы можете попробовать View.getRootView().

Будет Тейт
источник
5

Вы также можете переопределить, onContentChanged()который среди других уволен, когда setContentView()был вызван.

Крис
источник
Ответ
Эрнеста
2

Если вы используете Kotlin

    this.findViewById<View>(android.R.id.content)
                         .rootView
                         .setBackgroundColor(ContextCompat.getColor(this, R.color.black))
Хите саху
источник
1

Нет метода isContentViewSet. Вы можете поместить несколько фиктивных вызовов requestWindowFeature в блок try / catch перед setContentView следующим образом:

пытаться {
  requestWindowFeature (Window.FEATURE_CONTEXT_MENU);
  setContentView (...)
} catch (AndroidRuntimeException e) {
  // делать что-то или ничего
}

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

sergeytch
источник
-3

Лучший вариант, который я нашел, и менее навязчивый, это установить параметр тега в вашем xml, например:

PHONE XML LAYOUT

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="phone"/>

ПЛАНШЕТНАЯ ПЛАТА XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="tablet">

    ...

</RelativeLayout>

и затем назовите это в своем классе деятельности:

View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));

Надеюсь, это работает для вас.

Алехандро Теллез
источник
2
Как это отвечает на вопрос?
Оник