Visualizar o layout com a tag de raiz de mesclagem no Intellij IDEA / Android Studio

158

Vamos imaginar que estamos desenvolvendo componentes compostos baseados em LinearLayout. Então, criamos classes como esta:

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

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

Se usarmos LinearLayoutcomo raiz somelayout.xml, teremos um nível de visualização extra; portanto, usaremos a tag de mesclagem:

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

Mas na guia Visualizar na mesclagem do IDE sempre atua como FrameLayout, e veremos algo assim: Visualizar com mesclagem

(É o Android Studio, o Intellij IDEA é o mesmo, sobre o Eclipse, eu não sei)

A visualização acelera muito o desenvolvimento de layouts, é triste perder uma ajuda tão boa, mesmo para alguns layouts. Pode haver uma maneira de especificar, como a Visualização deve interpretar a mergetag em um layout específico?

darja
fonte
1
Gostaria de ver esse suporte adicionado também.
Christopher Perry
Isso pode ser solucionado em algum momento no futuro pelo atributo tools. code.google.com/p/android/issues/detail?id=61652
Jonas

Respostas:

352

Há um novo atributo de ferramentas parentTag ( adicionado no Android Studio 2.2 ) que você pode usar para especificar o tipo de layout para uma marca de mesclagem, que fará com que o layout seja renderizado corretamente na visualização do editor de layout.

Então, usando o seu exemplo:

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

Nota : Ambos android:layout_widthe android:layout_heightdevem ser especificados para que o layout seja exibido corretamente no editor.

starkej2
fonte
1
Alguém sabe como mostrar a visualização corretamente quando você adiciona sua tag de exibição personalizada em outro arquivo de layout? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Arst
2
Desde que você está usando ferramentas que você pode também usar ferramentas: layout_height = "match_parent"
cutiko
Perfeito! Obrigado. 1
Carson J.
66

Editar: resposta desatualizada. Veja a resposta de starkej2.


O Android Studio 0.5.8 adicionou suporte para ferramentas: showIn. Ao usá-lo, é possível visualizar layouts <mesclagem>.

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

layout / layout_merge.xml com ferramentas: 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 com 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>
Jonas
fonte
14
Boas notícias! Não é muito útil para componentes compostos, porque precisamos adicionar um layout extra apenas para visualização. Mas melhor que nada.
darja
Alguma idéia de algo semelhante é suportada no Eclipse?
Toguard 12/08/14
3
Você pode seguir um ticket, relatado por um desenvolvedor do Google aqui: code.google.com/p/android/issues/detail?id=61652
Neige
Defino alguns atributos para a visualização raiz (neste caso, RelativeLayout) programaticamente, como preenchimento. É claro que eles não são aplicados nesse layout auxiliar (porque você usa uma visão completamente diferente). A única solução foi usar toda a exibição personalizada no layout auxiliar.
Felix Edelmann
não ultrapassada ela poderia ser usada quando você não deseja visualização genérica
amorenew
-5

Também é possível usar a classe personalizada como pai em vez de mesclar como

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

E depois inflar diretamente esse layout e converter a exibição de resultado em SomeView. O Android studio verificará diretamente a classe pai SomeViewe lidará com a visualização como LinerLayout. Você pode usar o onFinishInflate()método no SomeViewpara vincular visualizações por findViewById(). O benefício desta solução é que você pode colocar todas as definições de layout ou de estilo diretamente no arquivo de layout, não pode usar o método como setOrientation()no código.

Átomo
fonte
2
Isso introduz uma recursão infinita e a pilha transborda ao tentar visualizar, fazendo com que todo o Android Studio pare para sempre.
Mato