我正在尝试设置AlertDialog以取悦客户。他们喜欢蓝色标题栏 Theme.Holo.Light.Dialog但是喜欢来自另一个主题的绿色复选框。 这就是我想要制作的东西:
所以,我有一个像这样的样式定义:
<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 );
但我无法让对话框显示绿色复选框而不是此主题中的蓝色。 我明白了:
我可以继续创建一个完整的布局,然后像这样使用:
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);
但这需要设置所有对话框的样式,而不仅仅是复选框。只是重新设置复选框的样式似乎更简单,但我无法做到这一点。
我必须做什么,除了创建一个完整的布局并使用绿色复选框而不是蓝色?
答案 0 :(得分:2)
实际上,您可以更改多选对话框中的复选框。
您的对话框需要一个自定义适配器,以便能够访问列表的视图。
然后,调用类CheckedTextView的方法setCheckMarkDrawable
。
以下是一个例子:
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
,首先,如上所述。
但是,如果您使用DialogFragment
和onCreateDialog
,那么您会在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样式一起使用。