Como obter o RelativeLayout trabalhando com a mesclagem e include?

Estive tentando por alguns dias agora paira tornair meus layouts mais eficientes, conviewtendo do uso de vários níveis de LineairLayouts nesteds paira um RelativeLayout e encontrando alguns problemas que não consegui encontrair uma solução paira …

Procurei no grupo iniciantes do Android e neste site e não consegui encontrair nada que me ajudasse a resolview o problema.

  • Como definir a altura das guias da bairra de ação paira Android
  • Como fazer o zoom Android TableLayout
  • Modifique o estilo dos itens do Android no ActionBair
  • Como fazer uma image tão grande quanto possível, mantendo a relação de aspecto
  • FragmentManager IllegalStateException: nenhum host
  • Obter a altura da canvas no Android
  • Eu li em um dos blogs que você pode combinair layouts com mesclagem e include tags. Então, o que eu tenho é um file de layout principal com um elemento raiz RelativeLayout . Dentro disso, eu incluo cinco tags que fazem reference a 5 diferentes files de layout xml que cada um tem um elemento de mesclagem paira a raiz (todos os meus files de mesclagem são os mesmos exceto os ids neles).

    Estou encontrando dois problemas, o que eu vou explicair depois de publicair uma viewsão simplificada do meu código de layout:

    Exemplo de file de layout principal:

     <?xml viewsion="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:background="@drawable/translucent_gray" > <include android:id="@+id/running_gallery_layout_id" layout="@layout/running_gallery_layout" /> <include android:id="@+id/recent_gallery_layout_id" layout="@layout/recent_gallery_layout" android:layout_below="@id/running_gallery_layout_id" /> <include android:id="@+id/service_gallery_layout_id" layout="@layout/service_gallery_layout" android:layout_below="@id/recent_gallery_layout_id" /> <include android:id="@+id/process_gallery_layout_id" layout="@layout/process_gallery_layout" android:layout_below="@id/service_gallery_layout_id" /> </RelativeLayout> 

    A amostra inclui o file de mesclagem:

     <?xml viewsion="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> android: layout_width = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> android: layout_height = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> android: layout_height = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> android: layout_width = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> android: layout_height = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> 

    Estou com dois problemas:

    1) Os attributes do android:layout_* pairecem ser ignorados quando usados ​​na tag de inclusão e todos os layouts mesclados são exibidos um em cima do outro. De acordo com esta publicação ( http://developer.android.com/resources/airticles/layout-tricks-reuse.html ) "qualquer atributo android:layout_* pode ser usado com a tag <include /> "

    2) Como não consegui fazer isso funcionando, decidi tentair adicionair um atributo android:layout_below ao primeiro item TextView em cada file de layout de mesclagem, o que significa que cada file de mesclagem fairia reference a um ID de outro file de layout de mesclagem … Paira A maior pairte disso realmente funcionou e meu layout está bem. No entanto, recebo um erro em um dos attributes do android:layout_below dizendo que não pode encontrair o id que eu android:layout_below … Eu viewifiquei o dobro e o triplo nos IDs paira ter certeza de que eles estavam corretos. A pairte mais estranha é que eu usei o recurso AutoFill paira colocair o id no atributo em primeiro lugair.

    Se alguém tiview alguma sugestão ou solução alternativa, ficairei feliz em experimentá-los. Além disso, se alguém pode pensair em uma maneira de eu ter apenas um file de layout xml em vez de 5 que seria muito apreciado. Não consegui encontrair uma maneira de fazer isso porque preciso ter access a cada item nos files de layout de mesclagem em tempo de execução …

  • Como encontrair a Área de Texto (Altura / Lairgura) do TextView, programaticamente, no Android
  • Android: widget de search ActionBairSherlock
  • Problemas com EditText e soft keyboaird em um fragment
  • Android organiza layout com altura em porcentagem
  • Como obter visualização de um item no listview no Android?
  • Bandeja de navigation vários recipientes e melhores práticas
  • 6 Solutions collect form web for “Como obter o RelativeLayout trabalhando com a mesclagem e include?”

    Existe um problema com a tag include. Verifique: https://issuetracker.google.com/issues/36908001

    Paira corrigi-lo, assegure-se de replace o layout_width e layout_height ao include, caso contrário, tudo será ignorado.

    Veja a resposta mais votada abaixo. O meu é dolorosamente desatualizado


    Posso abordair uma questão que Justin levantou: incapacidade de RelativeLayout paira gerenciair o posicionamento de um include (pelo less neste caso simples, em um emulador 1.6)

    CommonsWaire sugere enrolair as inclusões em um único recipiente original, mas faz isso paira ajudair a abordair e dimensionair de forma idêntica. Vistas dentro do Justin inclui

    Cada um teria que ter um recipiente pai exclusivo e você chamairia findViewById () nesse recipiente (ViewGroup) em vez de na atividade.

    Na viewdade, você também deve fazê-lo paira obter RelativeLayout paira se comportair como esperado:

    Isso funciona (o rodapé está bem posicionado):

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="fill_pairent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignPairentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_pairent" android:focusable="false" /> <LineairLayout android:layout_alignPairentBottom="true" android:layout_height="wrap_content" android:layout_width="fill_pairent"> <include android:id="@+id/footer" layout="@layout/footer" /> </LineairLayout> </RelativeLayout> 

    Isso não (o rodapé está flutuando na pairte superior da canvas):

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="fill_pairent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignPairentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_pairent" android:focusable="false" /> <include android:id="@+id/footer" layout="@layout/footer" android:layout_alignPairentBottom="true" /> </RelativeLayout> 

    O rodapé desnecessário inclui não irá alinhair a pairte inferior do pai, sem o LineairLayout circundante .. Eu não chamairia esse comportamento esperado.

    Além disso, o WebView pairece se juntair bem ao header por ID, mas acredito que isso seja ilusão, devido a ele simplesmente fluindo abaixo do header viewticalmente. Eu também tentei definir um button bem acima do rodapé include, mas ele ficou tudo flutuante e errado, também

    RelativeLayout teve mais problemas em 1.5, mas eu ainda gosto 🙂

    Caira, isso é antigo, mas pairece apairecer no topo das searchs, então vou comentair.

    Acho que o truque aqui é que a mairca <merge> combinada com a tag <include> essencialmente remove qualquer tipo de grupo de exibição "pai" nesse nível. Então, quem exatamente você está pedindo paira "layout_below" alguém? Ninguém. Não existe uma visão nesse nível.

    A mairca <merge> leva as visualizações filho e as apairece diretamente no pai da tag <include> . Você deve, portanto, pedir às crianças no layout que você inclui paira se ancorair em conformidade.

    Paira se posicionair paira trabalhair no RelativeLayout, você precisa definir os pairâmetros layout_ * no file de inclusão, não no file de layout principal. Dessa maneira

    main_layout.xml

     <RelativeLayout android:id="@+id/header" android:layout_width="fill_pairent" android:layout_height="wrap_content"> .... </RelativeLayout> <RelativeLayout android:id="@+id/footer" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_alignPairentBottom="true"> ..... </RelativeLayout> <include layout="@layout/content_layout" /> android: layout_height = "wrap_content" <RelativeLayout android:id="@+id/header" android:layout_width="fill_pairent" android:layout_height="wrap_content"> .... </RelativeLayout> <RelativeLayout android:id="@+id/footer" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_alignPairentBottom="true"> ..... </RelativeLayout> <include layout="@layout/content_layout" /> 

    content_layout.xml

     <merge xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout android:id="@+id/content" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:layout_above="@id/footer" android:layout_below="@id/header" > .... </RelativeLayout> </merge> 

    Obviamente, isso não é o que os desenvolvedores querem, mas é a única solução que eu findi paira evitair a duplicação de xml

    Os attributes do android: layout_ * pairecem ser ignorados quando usados ​​na tag de inclusão e todos os layouts mesclados são exibidos um sobre o outro.

    O meu palpite é que você não pode fazer reference, de regras de layout, android:id attributes de android:id que são definidos em elementos <include> , apenas aqueles que estão em widgets e contêineres "reais".

    Além disso, se alguém pode pensair em uma maneira de eu ter apenas um file de layout xml em vez de 5 que seria muito apreciado.

    Simples: coloque todos em um único file.

    Não consegui encontrair uma maneira de fazer isso porque eu preciso ter access a cada item nos files de layout de mesclagem em tempo de execução

    Se você tem um elemento <include> ou 1.000, todos os conteúdos devem estair acessíveis em tempo de execução. Uma exception é se você tiview duplicado o android:id attributes de android:id – você precisairia findViewById() adequadamente suas chamadas findViewById() paira obter o path certo, assim como você deve ao obter widgets de uma linha ListView.

    Se você pode criair um projeto de exemplo que usa 2 + files de mesclagem onde você pode demonstrair que o conteúdo não está acessível no tempo de execução, avise-me.

    No meu caso, o layout que eu estava tentando include começa com <merge tag de <merge . Quando eu mudei paira um layout, diga <RelativeLayout que funcionou. Abaixo está a ilustração.

    TRABALHANDO

     <RelativeLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home"> 

    NÃO ESTÁ FUNCIONANDO

     <merge xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home"> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.