2014-01-17 3 views
0

Я знаю, что эта тема обсуждалась много раз, но я нахожу ее настолько запутанной, поэтому, пытаясь взглянуть на SO и Google, я решил спросить.ListView: как правильно определить макет?

У меня есть вторичный Activity, который вызывается из основного. Макет определяется следующим образом (я отправляю то, что считаю соответствующей частью, если требуется что-то дополнительное, просто попросите его). Ниже кода вы найдете несколько скриншотов.

<LinearLayout 
    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" 
    android:background="@drawable/rounded_edges" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:orientation="vertical" 
    tools:context=".Bloqueados" > 

    <!-- TextView to set the activity tittle (I'm using a customized theme) --> 
    <TextView 
    ... /> 

    <!-- LinearLayout which shows the orange square --> 
    <LinearLayout 
     android:id="@+id/block_info" 
     android:background="@drawable/rounded_edges_orange" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <EditText 
      ... > 
     </EditText> 
    </LinearLayout> 

    <!-- LinearLayout to ask for the user to be blocked --> 
    <LinearLayout 
     ... > 

     <EditText 
      ... > 

      <requestFocus /> 
     </EditText> 

     <ImageButton 
      ... /> 
    </LinearLayout>  

    <!-- Here it goes, the LinearLayout that contains the ListView --> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"  
     android:baselineAligned="false" 
     android:orientation="vertical" > 

     <!-- This TextView is shown only if the ListView is empty --> 
     <TextView 
     android:id="@+id/block_empty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:paddingLeft="30dp" 
     android:text="@string/block_empty" 
     android:textStyle="italic" 
     android:textColor="#3085ef" /> 

     <!-- Else, this ListView is shown --> 
     <ListView 
     android:id="@+id/block_list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" > 
     </ListView> 

     <!-- Save button --> 
     <Button 
     android:id="@+id/btn_block_save" 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginTop="10dp" 
     android:onClick="btn_close" 
     android:background="@drawable/botones" 
     android:textColor="#FFFFFF" 
     android:text="@string/btn_save" />  
    </LinearLayout> 

</LinearLayout> 

Так, графически, это бывший скриншот:

Former screenshow

Ничего странного здесь. Итак, давайте заполнить ListView с некоторыми элементами:

Full list

Хорошо, до сих пор ничего странного, но высота экрана теперь заполнен. Давайте добавим еще один элемент в ListView.

Overflowed

И здесь идет проблема. Кнопка «Сохранить» исчезла (ну, она находится ниже последнего ListView, но она выходит за рамки экрана). Я знаю, что использование ScrollView + ListView - это плохая практика, поэтому, даже если у меня есть обходной путь, который отлично работает, я хочу избежать его использования и делать что-то правильно. Поэтому возникает вопрос: как сделать начальную прокрутку ListView, когда следующий добавленный элемент будет перемещать элементы под ним с экрана?

Спасибо!

ответ

2

layout_height = "wrap_content" означает расти, пока не будут показаны все дети. Вместо этого попробуйте использовать layout_height = "0dp" и layout_weight = "1". Пример:

<ListView 
    android:id="@+id/block_list" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:scrollbars="vertical" > 
    </ListView> 
+0

Как легко устранить головные боли! :-) Спасибо! Еще один вопрос: я понимаю, что на некоторых устройствах, с которыми я тестирую, при ориентации на альбомную ориентацию, макет нижнего уровня высоты соответствует только небольшому количеству первого элемента списка в списке, что делает невозможным прокрутку , Это, конечно, потому, что есть другие элементы компоновки над «ListView». Есть ли какое-нибудь обходное решение? – nKn

+0

Рад помочь. Примите мой ответ, если он сработает! Один из вариантов - создать еще один макет для ландшафтного режима, который будет иметь вид списка в другом положении. Или вы могли бы просто сделать так, чтобы он всегда оставался в портрете. –

Смежные вопросы