Frage Definierte XML-Layout im Layout-Land erscheint nicht in Android-Anwendung


Ich entwickle eine Anwendung nach Dieses Beispiel. Ich habe ein Landschaftslayout für header.xml in einem Layout-Land-Ordner definiert, aber wenn ich die Ausrichtung in Querformat ändere, wird das definierte Layout nicht auf dem Bildschirm angezeigt.

Weiß ich warum?

Vielen Dank

Aktualisiert :

Aktivitätscode:

public class ACENewsFeedActivity extends ListActivity {

    // Progress Dialog
    private ProgressDialog pDialog;

    // Array list for list view
    ArrayList<HashMap<String, String>> rssItemList = new ArrayList<HashMap<String,String>>();

    RSSParser rssParser = new RSSParser();

    List<RSSItem> rssItems = new ArrayList<RSSItem>();

    RssFeed rssFeed;

    private static String TAG_TITLE = "title";
    private static String TAG_LINK = "link";
    private static String TAG_DESRIPTION = "description";
    private static String TAG_PUB_DATE = "pubDate";
    //private static String TAG_GUID = "guid"; // not used

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.rss_item_list);

        /**
         * Calling a backgroung thread will loads recent articles of a website
         * @param rss url of website
         * */
        new loadRSSFeedItems().execute();
       }

       ....
}

XMl Layout im Querformat:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layoutHeader"
    android:layout_width="fill_parent"
    android:layout_height="50dip"
    android:layout_alignParentTop="true"
    android:background="@layout/header_gradient"
    android:orientation="horizontal">

    <!-- Logo -->

    <!-- Refresh -->


    <!-- Plus Button -->

    <ImageButton
        android:id="@+id/btnAddSite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="5dip"
        android:background="@null"
        android:src="@drawable/plus"
        android:layout_centerVertical="true" />

    <ImageView
        android:id="@+id/logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:src="@drawable/logo" />

    <ImageView
        android:id="@+id/refreshList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/refresh" />

</RelativeLayout>

8
2018-06-05 19:15


Ursprung


Antworten:


Mit Android können Sie verschiedene Versionen von Ressourcendateien bereitstellen, um bestimmte Gerätekonfigurationen zu unterstützen, einschließlich Bildschirmgröße / -auflösung und (wie Sie es versuchen) Geräteausrichtung. Wenn Android eine Layoutdatei lädt, sieht es zuerst in der res/layout-port Ordner (wenn es im Hochformat ist) oder in der res/layout-land Ordner (wenn es in Querformat ist). Wenn die Datei nicht gefunden wird, wird sie im regulären Ordner angezeigt res/layout Mappe.

Zusätzlich, wie erwähnt HierWenn bestimmte Gerätekonfigurationen während der Laufzeit geändert werden (z. B. Geräteausrichtung), startet Android den aktuellen Prozess neu, indem er den Status speichert, löscht und dann mit den gespeicherten Statusinformationen startet. Dies ermöglicht es, die Layout-Dateien erneut zu laden, und es wird den Ordner für die neue Ausrichtung suchen, wenn es versucht, sie zu laden.

Wenn Sie Ihre Anwendung im Hochformat starten, wird die Datei geladen res/layout-port oder res/layout. Wenn Sie das Gerät dann in die Landschaft drehen, wird Ihr Prozess zerstört und neu gestartet. Diesmal wird es jedoch in der Landschaft sein, damit es überprüft wird res/layout-land stattdessen für die Layout-Dateien.

Wenn Sie Ihre Dateien auf diese Weise eingerichtet haben, aber nicht so funktionieren, wie Sie es für richtig halten, vergewissere ich mich zuerst, dass sie nicht die richtigen Dateien verwendet, indem Sie zwei verschiedene Dateien verwenden header.xml Dateien in der layout-land und layout-port Ordner, vielleicht einen mit einem roten Hintergrund und einen mit einem grünen Hintergrund. Stellen Sie sicher, dass Sie die Dateireferenzen überprüfen und vielleicht Toast verwenden, um einige Debugging-Informationen auf dem Bildschirm zu posten, um sicherzustellen, dass die Layouts korrekt aufgefüllt werden.

Das Standardverhalten ist, dass Android die Orientierungsänderung (die Zerstörung Ihrer Aktivität und das Erstellen einer neuen Instanz, die alle Layoutdateien neu lädt) umfasst. Dieses Standardverhalten tritt immer auf, es sei denn, Ihr Aktivitäts-Tag in Ihrer Manifest-Datei enthält die Eigenschaft android: configChanges = "orientation". (Dieses Tag kann andere Argumente als die Orientierung annehmen - Android wird die Konfigurationsänderungen für alle Ereignisse außer denen, die Sie als Argumente für dieses Tag übergeben, verarbeiten.)

Wenn Sie die android:configChanges="orientation" Mit dem Tag sagst du Android, deine Aktivität NICHT zu zerstören und Layoutdateien NICHT neu zu laden, wenn sich die Ausrichtung des Geräts ändert. Anstelle des Standardverhaltens ruft es eine Methode auf (die Sie definieren), damit Sie alle Änderungen, die Sie vornehmen möchten, um die Orientierungsänderung selbst vornehmen zu können, anstatt es automatisch von android behandeln zu lassen. Es ist beabsichtigt, dass, wenn die Zerstörung Ihrer Aktivität eine große Unannehmlichkeit wäre, sie nicht automatisch zerstört werden muss.

BEARBEITEN: einige Dinge aus der Kommentardiskussion hinzugefügt


19
2018-06-05 19:41



Du solltest das definieren android:configChanges="orientation" in dem manifest Datei für diese Aktivität und überschreiben Sie die onConfigChanged() Methode darin setContentView()

Wie so:

@Override    
public void onConfigurationChanged(Configuration newConfig) {
    setContentView(R.layout.your_xml);

    super.onConfigurationChanged(newConfig);
}

5
2017-09-25 14:53