Я знаю, что эта тема обсуждалась много раз, но я нахожу ее настолько запутанной, поэтому, пытаясь взглянуть на 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>
Так, графически, это бывший скриншот:
Ничего странного здесь. Итак, давайте заполнить ListView
с некоторыми элементами:
Хорошо, до сих пор ничего странного, но высота экрана теперь заполнен. Давайте добавим еще один элемент в ListView.
И здесь идет проблема. Кнопка «Сохранить» исчезла (ну, она находится ниже последнего ListView
, но она выходит за рамки экрана). Я знаю, что использование ScrollView
+ ListView
- это плохая практика, поэтому, даже если у меня есть обходной путь, который отлично работает, я хочу избежать его использования и делать что-то правильно. Поэтому возникает вопрос: как сделать начальную прокрутку ListView
, когда следующий добавленный элемент будет перемещать элементы под ним с экрана?
Спасибо!
Как легко устранить головные боли! :-) Спасибо! Еще один вопрос: я понимаю, что на некоторых устройствах, с которыми я тестирую, при ориентации на альбомную ориентацию, макет нижнего уровня высоты соответствует только небольшому количеству первого элемента списка в списке, что делает невозможным прокрутку , Это, конечно, потому, что есть другие элементы компоновки над «ListView». Есть ли какое-нибудь обходное решение? – nKn
Рад помочь. Примите мой ответ, если он сработает! Один из вариантов - создать еще один макет для ландшафтного режима, который будет иметь вид списка в другом положении. Или вы могли бы просто сделать так, чтобы он всегда оставался в портрете. –