Как я могу расположить мой диалог => представление прокрутки => расширяемый вид списка? - PullRequest
0 голосов
/ 06 февраля 2012

Я хочу показать диалоговое окно в своем приложении для Android, чтобы пользователь мог изменить некоторые параметры.

Мой план расположения этого диалогового окна:

  • Диалог
    • ScrollView, упаковывающий все параметры
      • Группа параметров 1 - ExpandableListView
      • Группа опций 2 - как указано выше
      • Параметр верхнего уровня A - CheckedTextView
      • Опция верхнего уровня B - CheckedTextView
      • Опция верхнего уровня C - CheckedTextView
    • Кнопки ОК / Отмена

Но, когда я пытаюсь получить верный макет, я получаю либо свернутые группы опций, так что ExpandableListView имеет высоту, равную только первой группе, либо ExpandableListView, занимающий весь диалог, или подобное.

На скриншоте ниже вы видите мой диалог с группами опций синим цветом (отображается только один), опциями верхнего уровня зеленым, неиспользуемым пространством ScrollView красным и окном / отменой LinearLayout белым.

Screenshot of bad layout

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).

Есть ли простой способ заставить этот макет работать правильно? Если нет, то как мне представить меню опций с группами опций и опциями верхнего уровня?

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Используйте PreferenceActivity и PreferenceFragment в новом коде. Таким образом, вы не будете изобретать велосипед, и ваше приложение будет соответствовать другим на платформе.

0 голосов
/ 27 февраля 2012

С тех пор я видел много аргументов о том, что помещение одного прокручиваемого представления в другое прокручиваемое представление просто не работает.Я почти уверен, что это невозможно.

0 голосов
/ 06 февраля 2012

Вам следует подумать о том, чтобы переделать эту часть вашего приложения, поскольку наличие большого количества контента в диалоге может сбить пользователя с толку.Диалог предназначен для коротких и простых ответов, а не сложных.

Мое предложение изменить ваш подход к дизайну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...