gpt4 book ai didi

android - 如何自定义列表首选项单选按钮

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:34:05 25 4
gpt4 key购买 nike

我已经在我的应用程序中自定义了所有的单选按钮,但是 listPreference 中的单选按钮没有被自定义。

我使用了这个名为 btn_radio.xml 的 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

<style name="CustomRadioButton"    Parent="@android:style/Widget.CompoundButton.RadioButton">
<item name="android:button">@drawable/btn_radio</item>
</style>

在我的应用程序主题中,我做了这些更改

<item name="android:radioButtonStyle">@style/CustomRadioButton</item>
<item name="android:listChoiceIndicatorSingle">@style/CustomRadioButton</item>

此更改自定义我的应用程序中的所有单选按钮,但我的 ListPreference 中的单选按钮除外

最佳答案

无法直接从 XML 中设置 ListPreference 的样式。问题是 ListPreference(通过 DialogPreference)调用 AlertDialog.Builder(Context) 来构建它的 Dialog,而不是比 AlertDialog.Builder(Context context, int themeResourceId)。虽然后者允许提供主题,但前者不允许提供主题,导致它退回到默认的 Android 主题。

对于一个项目,我需要一个具有自定义标题颜色、自定义单选按钮样式和自定义 ListView 选择器(基本上是不同颜色的 Holo)的 ListPreference。我通过扩展 ListPreference 并覆盖 onPrepareDialogBu​​ilder(Builder)OnCreateDialogView() 解决了这个问题,所以我可以使用带有简单 ArrayAdapter 的自定义 ListView,而不是比 Dialog 的内置 ListView(不支持样式)。我还必须覆盖 onDialogClosed() 以便为首选项设置正确的值。

要使用它,您只需将 preferences.xml 中的首选项类名从 ListPreference 替换为 com.your.packagename.ThemedListPreference .除此之外,实现与 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 项目,我使用了下面的布局。请注意,drawable/btn_radio_holo_light 是一个 XML-drawable,就像您的 android-sdk/platforms/android-x/data/res/drawable 文件夹中的那个一样,只是引用了不同的 drawable。

<?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()),我使用了以下内容:

<?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>

关于android - 如何自定义列表首选项单选按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10460715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com