需要帮助获取自定义布局以使用我的Android AlertDialog

时间:2016-10-26 15:16:10

标签: android android-layout alertdialog

我已成功为Android应用程序创建了一个有效的AlertDialog:

public class MyClass extends DialogFragment{
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        ArrayList selectedItems = new ArrayList();
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.pick_toppings)
        builder.setMultiChoiceItems(R.array.my_array, null, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                if (isChecked) {
                    selectedItems.add(which);
                } else if (selectedItems.contains(which)) {
                    selectedItems.remove(Integer.valueOf(which));
                }
            }
        });
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                // do stuff here ...
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                // do stuff here ...
            }
        });

        return builder.create();
    }
}

此MultiChoiceItems列表由/res/values/array.xml

中的数组支持
<resources>
    <array name="my_array">
        <item>item 01</item>
        <item>item 02</item>
        <item>item 03</item>
        <item>item 04</item>
        <item>item 05</item>
    </array>
</resources>

从我的Activity中,我用这种方式调用AlertDialog:

MyClass myClass = new MyClass();
myClass.show(getSupportFragmentManager(), "My Dialog");

我现在要做的是使用AlertDialog的自定义布局,以便我可以执行交替行着色,自定义按钮和添加EditText之类的操作,这样我就可以使用“其他”选项来填充在“其他”中。

在进行一些谷歌搜索后,看起来我需要创建一个新的布局,并将AlertDialog的视图设置为此布局。所以,我创建了一个布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="other"
        android:textSize="18sp"/>
    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

然后我将它添加到我的DialogFragment类:

LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View view = layoutInflater.inflate(R.layout.my_new_layout, null);

然后

builder.setView(view);

你可以猜到,这不起作用。新的CheckBox和EditText是在从我的数组中填充的其他复选框之后插入的,但它看起来很糟糕,而且我似乎无法控制从数组创建的复选框的外观。

就像我说的,我希望能够添加这个新的CheckBox / EditText组合,并且能够自定义整个AlertDialog的外观。

我真的想使用/res/values/array.xml中的数组,这样如果我想在列表中添加新项目,我就不必硬编码新选项。

我想做的是什么?如果是这样,一些建议会很棒。

由于

这就是我希望我的AlertDialog看起来像/行为:

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作,使用

获取阵列
String[] myarray =  getResources().getStringArray(R.array.testArray);

使用每个数组项创建新的复选框对象并将其设置为膨胀视图

LinearLayout layout2 = new LinearLayout(context); layout2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

并循环遍历数组列表

layout2.addView(new Checkbox(context)); 

最后将父线性布局添加到膨胀视图inflatedView.addView(layout2);

答案 1 :(得分:0)

好的,我终于自己想出来了。这是我的决议:

新布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="right">
</LinearLayout>

新班级:

public class MyClass extends DialogFragment{
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        String[] theOptions = getResources().getStringArray(R.array.options);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.pick_toppings)

        LayoutInflater layoutInflater = getActivity().getLayoutInflater();
        LinearLayout view = (LinearLayout) layoutInflater.inflate(R.layout.my_layout, null);

        for(String option : theOptions){
            CheckBox checkbox = new CheckBox(getContext());
            checkbox.setText(option);
            view.addView(checkbox);
        }

        LinearLayout otherLinearLayout = new LinearLayout(getContext());
        otherLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
        otherLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        otherLinearLayout.setId(R.id.otherLinearLayout);

        CheckBox otherCheckBox = new CheckBox(getContext());
        otherCheckBox.setText("other");
        otherCheckBox.setId(R.id.otherCheckBox);

        EditText otherEditText = new EditText(getContext());
        otherEditText.setId(R.id.otherEditText);

        otherLinearLayout.addView(otherCheckBox);
        otherLinearLayout.addView(otherEditText);

        view.addView(otherLinearLayout);

        builder.setView(view);

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                // do stuff here ...
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                // do stuff here ...
            }
        });

        return builder.create();
    }
}

答案 2 :(得分:0)

  

创建自定义对话框片段并在其中添加所有项目和复选框   新的布局由程序化定义,即动态。写   代码中checkItemSelectedListener的代码。