Vorschau des Layouts mit Merge-Root-Tag in Intellij IDEA/Android Studio

Lesezeit: 4 Minuten

Benutzer-Avatar
Darja

Stellen wir uns vor, wir entwickeln zusammengesetzte Komponenten basierend auf LinearLayout. Also erstellen wir eine Klasse wie folgt:

public class SomeView extends LinearLayout {
    public SomeView(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(LinearLayout.VERTICAL);
        View.inflate(context, R.layout.somelayout, this);
    }
}

Wenn wir verwenden LinearLayout als Wurzel von somelayout.xmlhaben wir eine zusätzliche Ansichtsebene, also verwenden wir das Merge-Tag:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some other text"/>
</merge>

Aber auf der Registerkarte „Vorschau“ in der IDE fungiert Merge immer als FrameLayout, und wir werden so etwas sehen:
Vorschau mit Zusammenführen

(Es ist Android Studio, Intellij IDEA ist genauso, über Eclipse weiß ich nicht)

Die Vorschau beschleunigt die Entwicklung von Layouts erheblich, es ist traurig, dass selbst für einige Layouts eine so große Hilfe verloren geht. Möglicherweise gibt es eine Möglichkeit festzulegen, wie die Vorschau interpretiert werden soll merge Tag in einem bestimmten Layout?

  • Ich möchte, dass diese Unterstützung auch hinzugefügt wird.

    – Christoph Perry

    1. August 2013 um 6:14 Uhr

  • Dies könnte irgendwann in der Zukunft durch das Attribut tools gelöst werden. code.google.com/p/android/issues/detail?id=61652

    – Jonas

    8. Mai 2014 um 11:17 Uhr

Benutzer-Avatar
starkej2

Es gibt ein neues parentTag-Tools-Attribut (in Android Studio 2.2 hinzugefügt), die Sie verwenden können, um den Layouttyp für ein Merge-Tag anzugeben, wodurch das Layout in der Vorschau des Layout-Editors korrekt gerendert wird.

Also an deinem Beispiel:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:parentTag="LinearLayout"
    tools:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some other text"/>
</merge>

Notiz: Beide android:layout_width und android:layout_height muss angegeben werden, damit das Layout im Editor richtig angezeigt wird.

  • Weiß jemand, wie die Vorschau korrekt angezeigt wird, wenn Sie Ihr benutzerdefiniertes Ansichts-Tag in einer anderen Layoutdatei hinzufügen? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>

    – Arst

    14. August 2017 um 23:06 Uhr


  • Siehe visueller Unterschied raw.githubusercontent.com/nisrulz/android-tips-tricks/develop/…

    – Zar E. Ahmer

    22. Januar 2018 um 10:24 Uhr

  • Da Sie Tools verwenden, können Sie auch tools:layout_height=”match_parent” verwenden.

    – Kutiko

    2. Mai 2018 um 17:39 Uhr

  • Perfekt! Vielen Dank. +1

    – Carson J.

    6. Februar 2019 um 18:17 Uhr

  • Die width- und height-Tags scheinen nicht (mehr) nötig zu sein, getestet mit Android Studio Bumblebee | 2021.1.1 Patch 2.

    – Uwe

    3. März um 13:41 Uhr

Benutzer-Avatar
Jonas

Bearbeiten: Veraltete Antwort. Siehe Antwort von starkej2.


Android Studio 0.5.8 hat Unterstützung für tools:showIn hinzugefügt. Durch die Verwendung ist es möglich, Layouts in der Vorschau anzuzeigen.

http://tools.android.com/recent/androidstudio058released

layout/layout_merge.xml mit tools:showIn:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   tools:showIn="@layout/simple_relativelayout">

......

</merge>

layout/simple_relativelayout.xml mit Include:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/layout_merge"/>

</RelativeLayout>

  • Gute Nachrichten! Nicht sehr praktisch für zusammengesetzte Komponenten, da wir nur für die Vorschau ein zusätzliches Layout hinzufügen müssen. Aber besser als nichts.

    – Darja

    12. Mai 2014 um 9:59 Uhr

  • Irgendwelche Ideen zu etwas Ähnlichem werden in Eclipse unterstützt?

    – Bewachen

    12. August 2014 um 18:50 Uhr


  • Sie können einem Ticket folgen, das von einem Google-Entwickler hier gemeldet wurde: code.google.com/p/android/issues/detail?id=61652

    – Neige

    8. Mai 2015 um 10:30 Uhr

  • Ich habe einige Attribute für die Stammansicht (in diesem Fall RelativeLayout) programmgesteuert festgelegt, z. B. Padding. Natürlich werden sie in diesem Hilfslayout nicht angewendet (weil Sie eine völlig andere Ansicht verwenden). Die einzige Lösung bestand darin, die gesamte benutzerdefinierte Ansicht im Hilfslayout zu verwenden.

    – Felix Edelmann

    30. April 2016 um 15:52 Uhr

  • nicht veraltet, es könnte verwendet werden, wenn Sie keine generische Anzeige wünschen

    – wieder neu

    9. Juni 2018 um 6:09 Uhr

Es ist auch möglich, eine benutzerdefinierte Klasse als übergeordnete Klasse zu verwenden, anstatt sie zusammenzuführen

<com.mycompany.SomeView xmlns:android="http://schemas.android.com/apk/res/android">
...
</com.mycompany.SomeView>

Und dann direkt dieses Layout aufblasen und Ergebnisansicht dazu werfen SomeView. Android Studio überprüft direkt die übergeordnete Klasse von SomeView und behandeln Vorschau wie LinerLayout. Sie können verwenden onFinishInflate() Methode in der SomeView Ansichten zu binden findViewById(). Der Vorteil dieser Lösung ist, dass Sie alle Layoutdefinitionen oder Stildefinitionen direkt in die Layoutdatei einfügen können, Sie können keine Methode wie verwenden setOrientation() in Code.

  • Dies führt zu einer unendlichen Rekursion und der Stack läuft über, wenn versucht wird, eine Vorschau anzuzeigen, wodurch das gesamte Android Studio für immer hängen bleibt.

    – mato

    23. Juli 2015 um 15:54 Uhr


1345470cookie-checkVorschau des Layouts mit Merge-Root-Tag in Intellij IDEA/Android Studio

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

Privacy policy