Я хочу показать диалоговое окно в своем приложении для Android, чтобы пользователь мог изменить некоторые параметры.
Мой план расположения этого диалогового окна:
- Диалог
- ScrollView, упаковывающий все параметры
- Группа параметров 1 - ExpandableListView
- Группа опций 2 - как указано выше
- Параметр верхнего уровня A - CheckedTextView
- Опция верхнего уровня B - CheckedTextView
- Опция верхнего уровня C - CheckedTextView
- Кнопки ОК / Отмена
Но, когда я пытаюсь получить верный макет, я получаю либо свернутые группы опций, так что ExpandableListView имеет высоту, равную только первой группе, либо ExpandableListView, занимающий весь диалог, или подобное.
На скриншоте ниже вы видите мой диалог с группами опций синим цветом (отображается только один), опциями верхнего уровня зеленым, неиспользуемым пространством ScrollView красным и окном / отменой LinearLayout белым.
![Screenshot of bad layout](https://i.stack.imgur.com/LExMU.jpg)
refine_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- ScrollView so that the user can see all the options
Without filling the entire dialog and losing the ok / cancel buttons
The height is hardcoded - I'd like to make it fill_parent -->
<ScrollView
android:background="#FFFF0000"
android:layout_weight="0.5"
android:layout_width="match_parent"
android:layout_height="300dp"> <!--RED-->
<!-- Linear layout around the options
ScrollView complains if it wraps multiple children -->
<LinearLayout
android:background="#FF00FF00"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <!--GREEN-->
<!-- Option groups -->
<ExpandableListView
android:id="@+id/elvRefine"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000FF" /> <!--BLUE-->
<!-- Top level options -->
<CheckedTextView
android:id="@+id/checkboxA"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Top level option A" />
<CheckedTextView
android:id="@+id/checkboxB"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Top level option B" />
<CheckedTextView
android:id="@+id/checkboxC"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Top level option C" />
</LinearLayout>
</ScrollView>
<!-- OK, cancel buttons -->
<LinearLayout
android:background="#FFFFFFFF"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="right"> <!--WHITE-->
<Button
android:id="@+id/buttonOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OK" />
<Button
android:id="@+id/buttonCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel" />
</LinearLayout>
</LinearLayout>
getRefineDialog ()
private Dialog getRefineDialog() {
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.refine_dialog);
dialog.setTitle("Refine options");
dialog.setCancelable(true);
final ExpandableListView elv =
(ExpandableListView) dialog.findViewById(R.id.elvRefine);
elv.setAdapter(new RefineAdapter(this));
elv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
// cancel button listener
Common.setSimpleCancelListener(dialog, R.id.buttonCancel);
return dialog;
}
Документация ExpandableListView гласит:
Вы не можете использовать значение wrap_content для атрибута android: layout_height ExpandableListView в XML, если размер родителя также не указан строго (например, если родителем был ScrollView, вы не могли бы указать wrap_content, поскольку он также может иметь любую длину Однако вы можете использовать wrap_content, если родительский элемент ExpandableListView имеет определенный размер, например 100 пикселей.
... но я не думал, что это должно быть проблемой, потому что ScrollView имеет фиксированную высоту 300dp (или фиксированную высоту диалога, если родительский диалог установлен в match_parent).
Есть ли простой способ заставить этот макет работать правильно? Если нет, то как мне представить меню опций с группами опций и опциями верхнего уровня?