自定义样式对话框复选框

时间:2013-03-29 19:57:05

标签: android

我正在尝试设置AlertDialog以取悦客户。他们喜欢蓝色标题栏 Theme.Holo.Light.Dialog但是喜欢来自另一个主题的绿色复选框。 这就是我想要制作的东西:

enter image description here

所以,我有一个像这样的样式定义:

<style name="MyDialogTheme" parent="@android:Theme.Holo.Light.Dialog">
            <item name="android:listChoiceIndicatorMultiple">@drawable/checkbox_green</item>
</style> 

<style name="mycheckbox" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:button">@drawable/checkbox_box</item>

</style>

我有一个checkbox_green的定义如下,它只是PNG文件:          

<item android:state_checked="false" 
    android:drawable="@drawable/checkbox_unchecked" />

<item android:state_checked="true" 
    android:drawable="@drawable/checkbox_checked"/>

</selector>

我用Java创建了一个具有特定主题的对话框构建器,如下所示:

 ContextThemeWrapper ctw = new ContextThemeWrapper( mContext, R.style.MyDialogTheme);
 AlertDialog.Builder builder= new AlertDialog.Builder( ctw );

但我无法让对话框显示绿色复选框而不是此主题中的蓝色。 我明白了: enter image description here

我可以继续创建一个完整的布局,然后像这样使用:

 AlertDialog shareDialog  = new AlertDialog.Builder(mContext).create();
 LayoutInflater inflater = MainActivity.this.getLayoutInflater();

 View dialogView = null;
 dialogView = inflater.inflate(R.layout.share, (ViewGroup) getCurrentFocus());
 shareDialog.setView(dialogView);

但这需要设置所有对话框的样式,而不仅仅是复选框。只是重新设置复选框的样式似乎更简单,但我无法做到这一点。

我必须做什么,除了创建一个完整的布局并使用绿色复选框而不是蓝色?

3 个答案:

答案 0 :(得分:2)

实际上,您可以更改多选对话框中的复选框。

您的对话框需要一个自定义适配器,以便能够访问列表的视图。 然后,调用类CheckedTextView的方法setCheckMarkDrawable

以下是一个例子:

enter image description here

default_checkbox.xml

中的文件res/drawable
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">  

    <item android:state_checked="true"
        android:drawable="@drawable/checkbox_checked" /> <!-- checked -->

    <item android:state_pressed="true"
        android:drawable="@drawable/checkbox_checked" /> <!-- pressed -->

    <item android:drawable="@drawable/checkbox_default" /> <!-- default -->

</selector>

档案DialogUtil.java

package example.dialog;

import android.app.AlertDialog;
import android.content.Context;
import android.util.Log;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;

public class DialogUtil {

    private DialogUtil() {
    }

    public static AlertDialog show(Context context) {
        String[] items = {"text 1", "text 2", "text 3"};
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Test")
            .setPositiveButton("OK", null)
            .setAdapter(new CustomAdapter(context, items), null);
        AlertDialog dialog = builder.show();

        ListView list = dialog.getListView();
        list.setItemsCanFocus(false);
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        list.setOnItemClickListener(listener);
        return dialog;
    }

    private static OnItemClickListener listener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.i("DialogUtil", "Clicked on " + view);
        }
    };

    private static class CustomAdapter extends ArrayAdapter<String> {

        public CustomAdapter(Context context, String[] array) {
            super(context, android.R.layout.simple_list_item_multiple_choice, array);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            if (view instanceof CheckedTextView) {
                CheckedTextView checkedView = (CheckedTextView) view;
                checkedView.setCheckMarkDrawable(R.drawable.default_checkbox);
            }
            return view;
        }
    }
}

注意:如果您只是使用AlertDialog,那么在获得ListView之前,请先致电show,首先,如上所述。

但是,如果您使用DialogFragmentonCreateDialog,那么您会在ListView内获得onStart

答案 1 :(得分:0)

它应该如下...

首先按照任何兼容格式(jpeg,png)设计你想要的复选框......并将它们放在可绘制的文件夹中......

然后为按钮创建单独的xml并选择您为选定和未选中的复选框设计的图像...并将此文件放在项目的drawable文件夹中,并使用正确的名称说明customchk.xml ...

<?xml version="1.0" encoding="utf-8"?>
 <selector  xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_checked="false" android:drawable="@drawable/chk2" />   //custom image 
 <item android:state_checked="true" android:drawable="@drawable/chk1" />   //custom image 
 <item android:drawable="@drawable/chk2" /> <!-- default -->
</selector>

然后将您的复选框:按钮设置为您的xml文件...如下所示

<CheckBox
            android:id="@+id/notifs"
            android:layout_width="150dp"
            android:button="@drawable/customchk"     //your xml
            android:layout_height="wrap_content"
/>

我想它应该可行,你不需要改变所有的对话......

答案 2 :(得分:-1)

据我所知,如果不创建自定义View对象,就无法设置对话框的部分样式。

创建一个样式:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AlertDialogCustom" parent="@android:style/AlertDialog">
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
        <item name="android:textSize">10sp</item>
    </style>
</resources>

膨胀视图如:

AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));

Here are attributes for checkboxes与您的自定义AlertDialog样式一起使用。