Pratinjau tata letak dengan menggabungkan tag root di Intellij IDEA / Android Studio

158

Mari kita bayangkan kita sedang mengembangkan komponen senyawa berdasarkan LinearLayout. Jadi, kami membuat kelas seperti ini:

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

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

Jika kami akan menggunakan LinearLayoutsebagai root somelayout.xml, kami akan memiliki tingkat tampilan tambahan, jadi kami menggunakan tag gabungan:

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

Tapi di tab Preview di IDE gabungan selalu bertindak sebagai FrameLayout, dan kita akan melihat sesuatu seperti itu: Pratinjau dengan penggabungan

(Ini adalah Android Studio, Intellij IDEA sama saja, tentang Eclipse saya tidak tahu)

Pratinjau mempercepat pengembangan tata letak, sedih kehilangan bantuan besar bahkan untuk beberapa tata letak. Mungkin ada cara untuk menentukan, bagaimana Pratinjau harus menafsirkan mergetag dalam tata letak tertentu?

darja
sumber
1
Saya ingin melihat dukungan ini ditambahkan juga.
Christopher Perry
Ini mungkin dapat dipecahkan di masa mendatang oleh atribut tools. code.google.com/p/android/issues/detail?id=61652
Jonas

Jawaban:

352

Ada atribut tools parentTag baru ( ditambahkan di Android Studio 2.2 ) yang dapat Anda gunakan untuk menentukan tipe tata letak untuk tag gabungan, yang akan membuat tata letak dirender dengan benar dalam pratinjau editor tata letak.

Jadi gunakan contoh Anda:

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

Catatan : Keduanya android:layout_widthdan android:layout_heightharus ditentukan agar tata letak ditampilkan dengan benar di editor.

starkej2
sumber
1
Adakah yang tahu cara menampilkan pratinjau dengan benar ketika Anda menambahkan tag tampilan khusus di file tata letak lain? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Arst
2
Karena Anda menggunakan alat, Anda juga bisa menggunakan alat: layout_height = "match_parent"
cutiko
Sempurna! Terima kasih. +1
Carson J.
66

Sunting: Jawaban yang kedaluwarsa. Lihat jawaban oleh starkej2.


Android Studio 0.5.8 menambahkan dukungan untuk alat: showIn. Dengan menggunakannya, Anda dapat melihat pratinjau <menggabungkan> tata letak.

http://tools.android.com/recent/androidstudio058 dirilis

layout / layout_merge.xml dengan alat: 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 dengan menyertakan:

<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>
Jonas
sumber
14
Kabar baik! Tidak terlalu berguna untuk komponen majemuk, karena kita perlu menambahkan tata letak tambahan hanya untuk pratinjau. Tapi lebih baik daripada tidak sama sekali.
darja
Adakah ide tentang hal serupa yang didukung di Eclipse?
Toguard
3
Anda dapat mengikuti tiket, dilaporkan oleh pengembang google di sini: code.google.com/p/android/issues/detail?id=61652
Neige
Saya mengatur beberapa atribut ke tampilan root (dalam hal ini RelativeLayout) secara pemrograman, seperti padding. Tentu saja mereka tidak diterapkan dalam tata letak pembantu ini (karena Anda menggunakan tampilan yang sama sekali berbeda). Satu-satunya solusi adalah menggunakan seluruh tampilan khusus dalam tata letak pembantu.
Felix Edelmann
tidak ketinggalan jaman itu bisa digunakan ketika Anda tidak ingin melihat generik
amorenew
-5

Juga dimungkinkan menggunakan kelas khusus sebagai induk alih-alih gabungan seperti

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

Dan kemudian langsung mengembang tata letak ini dan melemparkan tampilan hasil SomeView. Studio Android akan langsung memeriksa kelas induk SomeViewdan menangani pratinjau suka LinerLayout. Anda dapat menggunakan onFinishInflate()metode dalam SomeViewuntuk mengikat tampilan oleh findViewById(). Manfaat dari solusi ini adalah Anda dapat menempatkan semua definisi tata letak atau definisi gaya langsung ke file tata letak, Anda tidak dapat menggunakan metode seperti setOrientation()dalam kode.

Atom
sumber
2
Ini memperkenalkan rekursi tak terbatas dan tumpukan meluap ketika mencoba untuk melihat pratinjau, membuat seluruh Android Studio menggantung selamanya.
mato