Wie kann ich erkennen, welches Layout von Android in meiner Anwendung ausgewählt ist?

Lesezeit: 10 Minuten

Benutzer-Avatar
Bobs

Angenommen, ich habe eine Aktivität mit drei verschiedenen Layouts in verschiedenen Ressourcenordnern. Zum Beispiel:

layout-land/my_act.xml
layout-xlarge/my_act.xml
layout-xlarge-land/my_act.xml

In verschiedenen Geräten und verschiedenen Positionen wird eine davon von Android ausgewählt.
Wie kann ich herausfinden, welche ausgewählt ist? programmatisch?

Hat Android eine API, die diese Layouts an das Programm zurückgibt?


Bearbeiten: Die Lösung von Graham Borland hat in einigen Situationen ein Problem, das ich in den Kommentaren erwähnt habe.

  • In Ihrem Gerät? oder XML-Layout?

    – Praveenkumar

    26. Juni 2012 um 10:13 Uhr

  • Ich möchte wissen, welches Layout in meiner Anwendung programmgesteuert ausgewählt ist.

    – Bubi

    26. Juni 2012 um 10:14 Uhr


  • Darf ich fragen, warum Sie das programmatisch wissen wollen?

    – MrJre

    26. Juni 2012 um 15:30 Uhr

  • Gute Frage.. Dies könnte verwendet werden, um die Auswahl von Android-Layouts zu untersuchen und zu verstehen.

    – Ronnie

    29. Juni 2012 um 6:20 Uhr


  • Ich bin ziemlich enttäuscht, dass Sie Anfragen nach weiteren Informationen wiederholt ignoriert haben, was mir geholfen hätte, die Probleme zu diagnostizieren, die Sie mit meiner Antwort gefunden haben.

    – Graham Borland

    28. Juli 2012 um 16:14 Uhr

Benutzer-Avatar
Graham Borland

Sie können eine andere einstellen android:tag -Attribut für die Ansichten in jeder unterschiedlichen Ressourcendatei, und lesen Sie das Tag zur Laufzeit mit zurück View.getTag().

Beispiel:

layout-xlarge-land/my_act.xml

<View
    android:id="@+id/mainview"
    android:tag="xlarge-landscape"
/>

layout-xlarge/my_act.xml

<View
    android:id="@+id/mainview"
    android:tag="xlarge-portrait"
/>

MeineAktivität.java

String tag = view.getTag();
if (tag.equals("xlarge-landscape") {
    ...
}

  • Jetzt habe ich 2 Layouts. 1)Layout und 2)Layout-xlarge-Land. für das erste ist das Tag “layout” und für das zweite “layout-xlarge-land”. Wenn ich mich einlogge onCreate() Methode gibt es mir den wahren Wert von Tags wie “layout-xlarge-land”. Aber wenn ich auf eine Schaltfläche auf dieser Seite klicke und diese Schaltfläche verwende findViewById() und erhalten Sie sein Tag, sein Wert ist das Standard-Layout-Tag “layout”. Warum?????

    – Bubi

    27. Juni 2012 um 6:37 Uhr


  • Ich habe einen tabHost in dieser Aktivität. Das ist mir in der Zeile aufgefallen tabHost.addTab(myTabSpec); das Tag wurde von “layout-xlarge-land” in “layout” geändert? warum???

    – Bubi

    27. Juni 2012 um 7:10 Uhr


  • Um Ihre erste Frage zu beantworten, posten Sie das onCreate() Ihrer Aktivität und Ihren Code zur Handhabung von Schaltflächenklicks sowie die relevanten Abschnitte der Layoutdateien.

    – Graham Borland

    29. Juni 2012 um 9:29 Uhr

  • @breceivemail Ich würde gerne helfen, die Probleme zu lösen, die Sie mit diesem Ansatz erlebt haben, aber Sie müssen weitere Informationen bereitstellen. Bitte posten Sie onCreate() Ihrer Aktivität und Ihren Code zur Handhabung von Schaltflächenklicks sowie die relevanten Abschnitte der Layoutdateien.

    – Graham Borland

    24. Juli 2012 um 16:40 Uhr

  • @breceivemail Ich glaube das TabHost verwendet auch das Tag, sodass Ihre Nutzung möglicherweise damit kollidiert. Sehen grepcode.com/file/repository.grepcode.com/java/ext/…

    – Eduard Dale

    26. Juli 2012 um 13:28 Uhr

Sie könnten eine erstellen values-<config> Verzeichnis für jede Ihrer unterstützten Konfigurationen. Erstellen Sie in jedem dieser Verzeichnisse eine strings.xml mit einer einzigen selected_configuration String, der die aktuelle Konfiguration beschreibt. Rufen Sie zur Laufzeit die Zeichenfolge mithilfe des Standards ab getString -Methode, die die Konfigurationsauflösung für Sie durchführt und die richtige Zeichenfolge für die Konfiguration zurückgibt. Dies ist ungetestet.

  • Sehr gute Lösung!!! Ich habe es getestet und es funktioniert. Es ist frei von Problemen, die in der Lösung von @Graham Borlans zu finden sind.

    – Bubi

    27. Juli 2012 um 7:08 Uhr

  • Um zu vermeiden, dass alle kopiert werden strings.xml Inhalt für jeden values-<config> Ressourcenordner können Sie eine benutzerdefinierte Datei wie z layout_type.xml und nur setzen selected_configuration drin.

    – Bubi

    27. Juli 2012 um 7:12 Uhr

  • Können Sie uns bitte mitteilen, ob dieses Problem bei der Implementierung dieser @breceivemail aufgetreten ist?

    – BrantApps

    21. Oktober 2012 um 17:15 Uhr


  • Toll! Tolle Lösung. Ich habe eine strings.xml in meinem Verzeichnis values-large-land erstellt, nur eine einzelne String-Ressource namens screen hinzugefügt und das Problem gelöst. Alle anderen Strings werden bei Bedarf aus main strings.xml geholt. Perfekt

    – Herrera

    5. April 2014 um 16:53 Uhr

  • Einfachheit ist Exzellenz! Vielen Dank!

    – Tash Pemhiwa

    17. Juni 2016 um 5:44 Uhr

Sie können versuchen, diesen Algorithmus zu wiederholen “Wie Android die am besten passende Ressource findet” – Es ist ganz einfach, besonders wenn Sie unterschiedliche Layouts nur für unterschiedliche Bildschirme haben.

  • Ich habe versucht, es in Android-Quellen zu finden, aber es ist nativer Code.

    – Jin35

    4. Juli 2012 um 4:46 Uhr

  • Ich denke, es ist zuverlässiger. Können Sie uns Beispielcode als Referenz in Stackoverflow geben? 🙂

    – Bubi

    4. Juli 2012 um 4:49 Uhr

  • Bestellung zur Auswahl ist hier developer.android.com/guide/topics/resources/… Ich nehme an, dass all diese Modifikatoren darin zu finden sind Context.getResources().getConfiguration()

    – Jin35

    4. Juli 2012 um 4:49 Uhr


  • Ich bevorzuge diesen Ansatz als Antwort. Aber es braucht einen vollständigen und anwendbaren Algorithmus zum Testen. Weil die Antwort von @ Graham auf den ersten Blick gut erscheint, aber bei einigen meiner komplizierten Aktivitäten auf Probleme gestoßen ist.

    – Bubi

    5. Juli 2012 um 6:18 Uhr


  • Tut mir leid, aber ich habe jetzt keine Zeit für Tests. Wenn ich es tue, werde ich Ergebnisse hier schreiben

    – Jin35

    5. Juli 2012 um 7:05 Uhr

Meine Antwort wird von @Graham Borland implementiert

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        switch(metrics.densityDpi){
             case DisplayMetrics.DENSITY_LOW:

             if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
             {
               Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
               String tag = view.getTag();
               if (tag.equals("small-landscape") {
                .....
              }
             } 
            else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
            {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
             String tag = view.getTag();
               if (tag.equals("small-potrait") {
                .....
              }
            }
            break;

             case DisplayMetrics.DENSITY_MEDIUM:

             if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
             {
               Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
               String tag = view.getTag();
               if (tag.equals("medium-landscape") {
                .....
              }
             } 
            else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
            {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
             String tag = view.getTag();
               if (tag.equals("medium-potrait") {
                .....
              }
            }
             break;

             case DisplayMetrics.DENSITY_HIGH:

               if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
             {
               Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
               String tag = view.getTag();
               if (tag.equals("large-landscape") {
                .....
              }
             } 
            else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
            {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
             String tag = view.getTag();
               if (tag.equals("large-potrait") {
                .....
              }
            }
             break;
        }

Dies funktioniert in API-Level 4 oder höher.

Ich gehe davon aus, dass Sie verwenden setContentView(int resID) um den Inhalt Ihrer Aktivitäten festzulegen.


METHODE 1 (Das ist meine Antwort)

Stellen Sie jetzt in all Ihren Layouts sicher, dass die Root-Ansicht immer das richtige Tag hat:

Beispiel:

layout-xlarge/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:tag="xlarge-landscape"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

layout-small/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:tag="small"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

Lassen Sie nun Ihre Aktivitäten diese Aktivität erweitern:

package shush.android.screendetection;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class SkeletonActivity extends Activity {

    protected String resourceType;

    @Override
    public void setContentView(int layoutResID) {
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(layoutResID, null);
        resourceType = (String)view.getTag();
        super.setContentView(view);
    }
}

In diesem Fall können Sie die verwenden resourceType um zu wissen, was die verwendete Ressourcenkennung ist.


METHODE 2 (Das war meine Antwort, aber bevor ich gepostet habe, dachte ich an die bessere)

Stellen Sie jetzt in all Ihren Layouts sicher, dass die Root-Ansicht immer das richtige Tag hat:

Beispiel:

layout-xlarge/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:tag="xlarge-landscape"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

layout-small/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:tag="small"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

Lassen Sie nun Ihre Aktivitäten diese Aktivität erweitern:

package shush.android.screendetection;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class SkeletonActivity extends Activity {

    @Override
    public void setContentView(int layoutResID) {
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(layoutResID, null);
        fix(view, view.getTag());
        super.setContentView(view);
    }

    private void fix(View child, Object tag) {
        if (child == null)
            return;

        if (child instanceof ViewGroup) {
            fix((ViewGroup) child, tag);
        }
        else if (child != null) {
            child.setTag(tag);
        }
    }

    private void fix(ViewGroup parent, Object tag) {
        for (int i = 0; i < parent.getChildCount(); i++) {
            View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                fix((ViewGroup) child, tag);
            } else {
                fix(child, tag);
            }
        }
    }
}

In diesem Fall haben alle Ihre Ansichten in Ihrer Hierarchie dasselbe Tag.

  • Ihre Lösung hat ein Problem. Was tun Sie, wenn Ihr Bildschirm gedreht und Ihr Layout in Hoch- oder Querformat geändert wird?

    – Bubi

    30. Juni 2012 um 5:17 Uhr

  • Wenn Ihr aktuelles Tag beispielsweise “xlarge-land” ist, nachdem das Rotations-Tag in “xlarge-port” geändert werden muss

    – Bubi

    30. Juni 2012 um 6:50 Uhr

  • ja so? es wird sich ändern (onCreate wird erneut aufgerufen und das Tag wird gesetzt)\

    – Scherif el-Khatib

    30. Juni 2012 um 9:53 Uhr

  • Hast du meinen Kommentar zu @Grahams Antwort gelesen? Ich denke, diese Lösungen könnten Probleme haben, die ich in den Kommentaren erwähnt habe.

    – Bubi

    30. Juni 2012 um 16:01 Uhr


  • Ich gebe Ihnen 2 Lösungen, die funktionieren. Und die Situation, die Ihr Kommentar feststellt, impliziert, dass das Layout normal ist und an der Herangehensweise nichts auszusetzen ist. Probieren Sie sie aus und wenn sie nicht funktionieren, helfe ich Ihnen gerne (:

    – Scherif el-Khatib

    30. Juni 2012 um 17:31 Uhr

Benutzer-Avatar
schturma

Informationen zur Bildschirmausrichtung und -größe erhalten Sie unter Resources Objekt. Von dort aus können Sie nachvollziehen, welches Layout verwendet wird.

getResources().getConfiguration().orientation; – gibt entweder zurück Configuration.ORIENTATION_PORTRAIT oder Configuration.ORIENTATION_LANDSCAPE.

int size = getResources().getConfiguration().screenLayout; – gibt die Maske der Bildschirmgröße zurück. Sie können mit den Größen Small, Normal, Large und xLarge testen. Zum Beispiel:

if ((size & Configuration.SCREENLAYOUT_SIZE_XLARGE)==Configuration.SCREENLAYOUT_SIZE_XLARGE)

  • Ihre Lösung hat ein Problem. Was tun Sie, wenn Ihr Bildschirm gedreht und Ihr Layout in Hoch- oder Querformat geändert wird?

    – Bubi

    30. Juni 2012 um 5:17 Uhr

  • Wenn Ihr aktuelles Tag beispielsweise “xlarge-land” ist, nachdem das Rotations-Tag in “xlarge-port” geändert werden muss

    – Bubi

    30. Juni 2012 um 6:50 Uhr

  • ja so? es wird sich ändern (onCreate wird erneut aufgerufen und das Tag wird gesetzt)\

    – Scherif el-Khatib

    30. Juni 2012 um 9:53 Uhr

  • Hast du meinen Kommentar zu @Grahams Antwort gelesen? Ich denke, diese Lösungen könnten Probleme haben, die ich in den Kommentaren erwähnt habe.

    – Bubi

    30. Juni 2012 um 16:01 Uhr


  • Ich gebe Ihnen 2 Lösungen, die funktionieren. Und die Situation, die Ihr Kommentar feststellt, impliziert, dass das Layout normal ist und an der Herangehensweise nichts auszusetzen ist. Probieren Sie sie aus und wenn sie nicht funktionieren, helfe ich Ihnen gerne (:

    – Scherif el-Khatib

    30. Juni 2012 um 17:31 Uhr

Benutzer-Avatar
Raghu Nagaraju

Ich weiß nicht, wie ich es genau finden kann. Aber wir können es auf andere Weise finden.

Fügen Sie eine Textansicht in allen Layouts hinzu (Sichtbarkeit ausgeblendet). Weisen Sie entsprechend Werte wie xlarge, land, xlarge-land zu.

Rufen Sie im Programm den Wert aus der Textansicht ab. Irgendwie können wir uns so kennenlernen.

  • Schauen Sie sich die Antwort von @ Graham Borland an. Es ist Ihre Lösung. Und schau dir die Kommentare an. Seine Lösung hat in einigen Fällen Probleme.

    – Bubi

    25. Juli 2012 um 5:09 Uhr

1246580cookie-checkWie kann ich erkennen, welches Layout von Android in meiner Anwendung ausgewählt ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy