Android: problemas de layout XML
-
27-09-2019 - |
Pergunta
Eu tenho tentado criar um relativewout com um cabeçalho, corpo (lista) e rodapé. Eu quero que o cabeçalho esteja acima de tudo (alinhado ao topo), o corpo (lista) está sob o cabeçalho (quando rolar) e o rodapé (alinhado ao fundo) para estar acima do corpo (lista) - somente quando está visível.
Consegui fazer isso perfeitamente quando se trata de como as coisas parecem, mas aparentemente o layout XML é a causa dos problemas que tenho tido ao clicar no ListItems (Veja aqui, e aqui).
Para resolver os problemas, tive que embrulhar o ListView com o LinearLayout e colocá -lo entre o cabeçalho e o rodapé (no XML). Isso resolve os problemas de cliques do ListItems, mas cria um novo problema - o rodapé esconde o Último item da ListView, mesmo que a lista fique sob o cabeçalho ao rolá -lo para baixo.
Estou praticamente desesperado aqui:
Este é o XML que cria o layout perfeito, mas causa o item da lista clicando em problemas:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#ffffff"
>
<RelativeLayout
android:background="@drawable/top_background"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:id="@+id/top_control_bar"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="Droidmarks"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/add_bookmark"
android:textSize="20dip"
android:textColor="#a0cb26"
android:shadowColor="#7a9b1b"
android:shadowRadius="5"
android:layout_marginLeft="5dip"
android:gravity="left|center" />
<Button
android:id="@+id/add_bookmark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center"
android:layout_alignParentRight="true"
android:text="Add"
/>
</RelativeLayout>
<LinearLayout
android:id="@+id/bottom_control_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/top_background"
android:visibility="invisible"
>
<Button
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center"
android:layout_alignParentRight="true"
android:text="Add"
/>
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/top_control_bar"
android:layout_above="@id/bottom_control_bar"
android:drawSelectorOnTop="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:cacheColorHint="#ffffff"
android:listSelector="@drawable/selected_item"
/>
<TextView android:id="@android:id/empty" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No Bookmarks found. You can add one by clicking the star."
android:layout_below="@id/top_control_bar" android:layout_above="@id/bottom_control_bar" />
</RelativeLayout>
Este é o XML que esconde o último item da lista, mas resolve os problemas de clique:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#ffffff"
>
<RelativeLayout
android:background="@drawable/top_background"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:id="@+id/top_control_bar"
android:layout_alignParentTop="true"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="Droidmarks"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/add_bookmark"
android:textSize="20dip"
android:textColor="#a0cb26"
android:shadowColor="#7a9b1b"
android:shadowRadius="5"
android:layout_marginLeft="5dip"
android:gravity="left|center" />
<Button
android:id="@+id/add_bookmark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center"
android:layout_alignParentRight="true"
android:text="Add"
/>
</RelativeLayout>
<LinearLayout
android:id="@+id/listArea"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@id/top_control_bar"
>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"
android:cacheColorHint="#ffffff" />
<TextView android:id="@android:id/empty" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No Bookmarks found. You can add one by clicking the star." />
</LinearLayout>
<LinearLayout
android:id="@+id/bottom_control_bar"
android:layout_above="@id/listArea"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/top_background"
android:orientation="horizontal"
android:visibility="visible"
>
<Button
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center"
android:layout_alignParentRight="true"
android:text="Add"
/>
</LinearLayout>
</RelativeLayout>
Eu apreciaria qualquer ajuda para encontrar uma solução para ambos os problemas!
Obrigada!
Solução
Posso perguntar por que você está usando um RelativeLayout para o contêiner? Parece um lugar perfeito para usar apenas um linearlayout com uma área central ponderada (o ListView) configurado para levar toda a área restante após o cabeçalho e rodapé do Wrap_Height-set. O RelativeLayouts é ótimo para simplificar layouts profundamente aninhados que contêm elementos horizontais e verticais, mas sua camada externa aqui contém apenas 3 elementos verticais de qualquer maneira, então vá com um linearlayout com orientation:vertical
A menos que esteja perdendo alguma coisa aqui.
EDIT: Em suma, tente isso; Isso deve fornecer um cabeçalho de altura fixo, um rodapé de altura de embrulho e a área central ocupando todo o espaço restante. Verifique se o layout externo está definido como fill_parent
altura e a área do meio é definida como uma altura fixa, mas com um layout_weight="1"
. Eu gosto de usar "0px" para o layout_height base quando estou usando layout_eight apenas para mantê -lo claro para mim quando volto e releio mais tarde.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ffffff"
>
<RelativeLayout
android:background="@drawable/top_background"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:id="@+id/top_control_bar"
> <!-- snip - inner contents unchanged -->
</RelativeLayout>
<LinearLayout
android:id="@+id/listArea"
android:layout_width="fill_parent"
android:layout_height="0px"
android:layout_weight="1"
android:orientation="horizontal"
><!-- snip - inner contents unchanged -->
</LinearLayout>
<LinearLayout
android:id="@+id/bottom_control_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/top_background"
android:orientation="horizontal"
android:visibility="visible"
><!-- snip - inner contents unchanged -->
</LinearLayout>
</LinearLayout>