如何自定义列表preference单选按钮 [英] How to customize list preference radio button
问题描述
我已定制的所有单选按钮在我的应用程序,但在列表preference的单选按钮不会被定制。
I have customized all the radioButtons in my application but the radioButtons in the listPreference does not get customized.
我已经使用这个XML命名btn_radio.xml
I have used this xml named btn_radio.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:state_window_focused="false"
android:drawable="@drawable/radio_selected" />
<item android:state_checked="false" android:state_window_focused="false"
android:drawable="@drawable/radio_unselected" />
<item android:state_checked="true" android:state_pressed="true"
android:drawable="@drawable/radio_selected" />
<item android:state_checked="false" android:state_pressed="true"
android:drawable="@drawable/radio_unselected" />
<item android:state_checked="true" android:state_focused="true"
android:drawable="@drawable/radio_selected" />
<item android:state_checked="false" android:state_focused="true"
android:drawable="@drawable/radio_unselected" />
<item android:state_checked="false" android:drawable="@drawable/radio_unselected" />
<item android:state_checked="true" android:drawable="@drawable/radio_selected" />
</selector>
这是它扩展了Android的定制单选按钮customRadioButton
This is the customRadioButton which extends the android custom radio button
<style name="CustomRadioButton" Parent="@android:style/Widget.CompoundButton.RadioButton">
<item name="android:button">@drawable/btn_radio</item>
</style>
在我的应用程序的主题,我已经这样做了更改
in the theme of my application I have done this changes
<item name="android:radioButtonStyle">@style/CustomRadioButton</item>
<item name="android:listChoiceIndicatorSingle">@style/CustomRadioButton</item>
这改变自定义我的应用程序的所有单选按钮除了在我的名单preference单选按钮
推荐答案
从XML样式化目录preference
是不能直接。问题是,目录preference
(通过对话preference
)调用 AlertDialog.Builder(上下文)
来建立自己的对话框
,而不是 AlertDialog.Builder(上下文的背景下,INT themeResourceId)
。而后者则允许提供一个主题,前者没有,导致它回退到一个默认的Android主题
Styling the ListPreference
from XML is not directly possible. The problem is that ListPreference
(through DialogPreference
) calls AlertDialog.Builder(Context)
to build its Dialog
, rather than AlertDialog.Builder(Context context, int themeResourceId)
. While the latter allows for providing a theme, the former does not, causing it to fall back to a default Android theme.
有关的一个项目,我需要一个目录preference
与自定义标题颜色,自定义单选按钮样式和一个自定义的ListView选择器(基本上,全息以不同的颜色)。我通过在prepareDialogBuilder(生成器)
和<$ C扩展目录preference
并覆盖解决了这个$ C> OnCreateDialogView()这样我就可以使用自定义的ListView用一个简单的ArrayAdapter,而不是对话框
的内置的ListView
(其中不具有样式的支持)。我也不得不重写 onDialogClosed()
,以设置正确的值到preference。
For a project, I needed a ListPreference
with a custom title-color, a custom radiobutton-style and a custom ListView-selector (basically, Holo in a different color). I solved this by extending ListPreference
and overriding onPrepareDialogBuilder(Builder)
and OnCreateDialogView()
so I could use a custom ListView with a simple ArrayAdapter, rather than Dialog
's built-in ListView
(which doesn't have support for styling). I also had to override onDialogClosed()
in order to set the right value to the preference.
为了使用它,你所要做的就是替换的preference类名在preferences.xml ROM 目录preference
到 com.your.packagename.ThemedList preference
。除此之外,实施相同列出preference
In order to use it, all you have to do is replace the classname of the preference in your preferences.xml rom ListPreference
to com.your.packagename.ThemedListPreference
. Other than that, the implementation is identical to ListPreference.
public class ThemedListPreference extends ListPreference implements OnItemClickListener {
public static final String TAG = "ThemedListPreference";
private int mClickedDialogEntryIndex;
private CharSequence mDialogTitle;
public ThemedListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ThemedListPreference(Context context) {
super(context);
}
@Override
protected View onCreateDialogView() {
// inflate custom layout with custom title & listview
View view = View.inflate(getContext(), R.layout.dialog_settings_updatetime, null);
mDialogTitle = getDialogTitle();
if(mDialogTitle == null) mDialogTitle = getTitle();
((TextView) view.findViewById(R.id.dialog_title)).setText(mDialogTitle);
ListView list = (ListView) view.findViewById(android.R.id.list);
// note the layout we're providing for the ListView entries
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
getContext(), R.layout.btn_radio,
getEntries());
list.setAdapter(adapter);
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
list.setItemChecked(findIndexOfValue(getValue()), true);
list.setOnItemClickListener(this);
return view;
}
@Override
protected void onPrepareDialogBuilder(Builder builder) {
// adapted from ListPreference
if (getEntries() == null || getEntryValues() == null) {
// throws exception
super.onPrepareDialogBuilder(builder);
return;
}
mClickedDialogEntryIndex = findIndexOfValue(getValue());
// .setTitle(null) to prevent default (blue)
// title+divider from showing up
builder.setTitle(null);
builder.setPositiveButton(null, null);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
mClickedDialogEntryIndex = position;
ThemedListPreference.this.onClick(getDialog(), DialogInterface.BUTTON_POSITIVE);
getDialog().dismiss();
}
@Override
protected void onDialogClosed(boolean positiveResult) {
// adapted from ListPreference
super.onDialogClosed(positiveResult);
if (positiveResult && mClickedDialogEntryIndex >= 0
&& getEntryValues() != null) {
String value = getEntryValues()[mClickedDialogEntryIndex]
.toString();
if (callChangeListener(value)) {
setValue(value);
}
}
}
}
有关我的ListView项我用下面的布局。请注意,可绘制/ btn_radio_holo_light是一个XML抽拉像在你的Android的SDK /平台/ Android的X /数据/ RES /绘制文件夹,只能用引用不同的可绘制。
For my ListView items I used the layout below. Note that drawable/btn_radio_holo_light is an XML-drawable like the one in your android-sdk/platforms/android-x/data/res/drawable folder, only with references to different drawables.
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkMark="@drawable/btn_radio_holo_light"
android:gravity="center_vertical"
android:minHeight="@dimen/list_item_minheight"
android:paddingLeft="@dimen/list_item_paddingLeft"
android:paddingRight="@dimen/list_item_paddingLeft" />
有关我的对话框布局( onCreateDialogView()
),我用了以下内容:
For my Dialog layout (onCreateDialogView()
), I used the following:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:textColor="@color/title_color"
android:textSize="22sp" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/divider_color" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@drawable/list_selector" />
</LinearLayout>
这篇关于如何自定义列表preference单选按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!