Wie erhalte ich die Inhaltsansicht von Activity?

279

Welche Methode sollte ich aufrufen, um zu erfahren, ob eine Aktivität ihre contentView hat (nachdem die Methode setContentView () aufgerufen wurde)?

teoREtik
quelle

Antworten:

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

oder

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

oder

this.findViewById(android.R.id.content).getRootView()
ernest
quelle
4
oder getWindow().findViewById(android.R.id.content):)
Alex Lockwood
1
Dies funktioniert gut, wenn es um das Abrufen der übergeordneten Ansicht geht ... BUt..wenn ich dies versuche.findViewById (android.R.id.content) .setBackgroundDrawable (d); es dosent Arbeit .. Können Sie bitte vorschlagen .. Danke im Voraus
Rajesh Wadhwa
3
Wenn Sie ein Layout aus XML mithilfe von installieren setContentView(R.layout.my_view), wird das übergeordnete Element dieses Layouts zurückgegeben.
Jay Lieske
Hallo @ernest, ich habe eine Sortierfrage wie Wenn ich in meinem Layout ein Bild oben habe als zwei Registerkarten in der Registerkartenleiste. und unten wird ein SatelliteMenu geöffnet, in dem Menüpunkte verwischt werden sollen.
Devendra Singh
1
Inhalt existiert nicht für Android.Resource.Id.
Justin
23

Sie können die Ansicht Zurück erhalten, wenn Sie Ihrem Layout eine ID hinzufügen.

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

Und rufen Sie es von findViewById auf ...

Papachan
quelle
Dies ist der robusteste Weg, um das Stammverzeichnis eines installierten Layouts zu ermitteln.
Jay Lieske
3
An was gehst du weiter findViewById?
Trans
1
@trans View contentView = findViewById (R.id.my_relative_layout_id);
Justin Liu
11

Wie wäre es mit

View view = Activity.getCurrentFocus();
mike jones
quelle
Wie hat das nicht mehr Daumen hoch? Funktioniert super!
Aeskreis
1
@aeskreis, weil es in meinem Fall null zurückgibtcurrentFocus?.let { ... }
user924
10

Vielleicht möchten Sie es versuchen View.getRootView().

Will Tate
quelle
5

Sie können auch überschreiben, onContentChanged()was unter anderem ausgelöst wird, wenn setContentView()es aufgerufen wurde.

Chris
quelle
ernests Antwort gibt Ihnen die aktuelle fokussierte Ansicht, auch wenn sie eine scrollbare Ansicht enthält
YuDroid
2

Wenn Sie verwenden Kotlin

    this.findViewById<View>(android.R.id.content)
                         .rootView
                         .setBackgroundColor(ContextCompat.getColor(this, R.color.black))
Hitesh Sahu
quelle
1

Es gibt keine "isContentViewSet" -Methode. Sie können einen Dummy-Aufruf von requestWindowFeature in den try / catch-Block einfügen, bevor Sie setContentView wie folgt einstellen:

Versuchen {
  requestWindowFeature (Window.FEATURE_CONTEXT_MENU);
  setContentView (...)
} catch (AndroidRuntimeException e) {
  // mach was oder nichts
}}

Wenn die Inhaltsansicht bereits festgelegt wurde, löst requestWindowFeature eine Ausnahme aus.

sergeytch
quelle
-3

Die beste Option, die ich gefunden habe und die weniger aufdringlich ist, ist das Festlegen eines Tag-Parameters in Ihrer XML, wie z

TELEFON 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"/>

TABLET XML LAYOUT

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

und rufen Sie dies dann in Ihrer Aktivitätsklasse auf:

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

Hoffe es funktioniert für dich.

Alejandro Tellez
quelle
2
Wie beantwortet dies die Frage?
Onik