如何布置对话框=>滚动视图=>可扩展列表视图?

时间:2012-02-06 05:22:43

标签: android android-layout

我想在我的Android应用中显示一个对话框,让用户更改一些选项。

我对此对话框的布局计划是:

  • 对话
    • ScrollView包装所有选项
      • 选项组1 - ExpandableListView
      • 选项组2 - 如上所述
      • 顶级选项A - CheckedTextView
      • 顶级选项B - CheckedTextView
      • 顶级选项C - CheckedTextView
    • 确定/取消按钮

但是,当我尝试将布局设置为正确时,我最终选择了折叠选项组,以便ExpandableListView只有第一组的高度,或者ExpandableListView占用整个对话框,或者类似。

在下面的屏幕截图中,您可以看到我的对话框,其中选项组为蓝色(仅显示一个),顶级选项为绿色,未使用的ScrollView空间为红色,OK /取消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 documentation说:

  

如果父级的大小也没有严格指定,则不能将值wrap_content用于XML中的ExpandableListView的android:layout_height属性(例如,如果父级是ScrollView,则无法指定wrap_content,因为它也可以是任意长度但是,如果ExpandableListView父级具有特定大小(例如100像素),则可以使用wrap_content。

...但我认为这不应该是一个问题,因为ScrollView的固定高度为300dp(如果父对话框设置为match_parent,则为对话框的固定高度)。

是否有一种简单的方法可以使此布局正常工作?如果没有,我应该如何用选项组和顶级选项来表示选项菜单?

3 个答案:

答案 0 :(得分:1)

在新代码中使用PreferenceActivity和PreferenceFragment。这样你就不会重新发明轮子,你的应用程序将适合平台上的其他人。

答案 1 :(得分:0)

您应该考虑重做应用程序的这一部分,在对话框中包含如此多的内容会使用户感到困惑。该对话框用于简短而简单的答案,而不是复杂的答案。

我的建议是改变你的设计方法。

答案 2 :(得分:0)

我已经看到很多参数将一个可滚动视图放在另一个可滚动视图中但是不起作用。我很确定这是不可能的。