当前位置: 首页 > 知识库问答 >
问题:

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

昝光临
2023-03-14

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

我用了这个名为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自定义单选按钮

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

此更改自定义我的应用程序中除列表首选项中的单选按钮之外的所有单选按钮

共有2个答案

谭凯
2023-03-14

请在这里看到我的答案,也许有帮助。

这是解决问题的一种更简单的方法。

毋承基
2023-03-14

无法直接从XML设置ListPresion样式。问题是ListPresion(通过DialogPresion)调用AlertDialog.Builder(Context)来构建其Dialog,而不是AlertDialog.Builder(Context上下文,int themeResourceId)。后者允许提供主题,前者不允许,导致它退回到默认的Android主题。

对于一个项目,我需要一个带有自定义标题颜色、自定义无线电按钮样式和自定义ListView-selector(基本上是不同颜色的Holo)的ListPretion解决了这个问题,我通过扩展ListPresion并覆盖onPreareDialogBuilder(Builder)OnCreateDialogView(),这样我就可以使用带有简单ArrayAdapter的自定义ListView,而不是Dialog的内置ListView(它不支持样式)。我还必须覆盖onDialogClosed()才能为首选项设置正确的值。

为了使用它,您只需在首选项中替换首选项的类名。xml从ListPreferencecom.your.packagename.ThemedListPreferency。除此之外,该实现与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可绘制文件,与您的android sdk/platforms/android-x/data/res/dravable文件夹中的文件类似,只是引用了不同的可绘制文件。

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

对于我的对话框布局(在创建对话框视图 ()上),我使用了以下内容:

<?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>
 类似资料:
  • 我目前正在尝试自定义首选项部分的颜色。但我不知道该怎么做。 在我的应用程序中,我有两个主题:黑暗主题和光明主题。这是用户选择的一个选项。在我的主要活动中,我设置了用户选择的主题。 在我使用 attr 定义要显示的颜色之后。 当前列表首选项: 代码:style.xml 就像我说的,我已经试过解决办法了。我该怎么办? 非常感谢托马斯 编辑我将preferenceActivity更改为preferenc

  • 我有以下偏好列表。 我想用图像图标替换某些项目的单选按钮。例如,它可能是这样的: 我是列表偏好活动的新手。请给出一些建议?

  • 问题内容: 如何在flutter中创建这样的自定义单选按钮组 问题答案: 这是完整的代码 To use :

  • ListPreferenceHey我正在使用PreferenceActivity,并使用ListPreferency添加了单选按钮。问题是listPreference使用了自己的对话框,其中有蓝色单选按钮(Lollipop上为绿色),我需要将其更改为橙色。我设法得到对话框,并使用以下命令更改标题和分隔线颜色: 那么如果标题id是“android:id/alertTitle”,divder id是“

  • 在Bootstrap 4中,我们已经加了一系列的全局选项,让你能够在项目中轻松定制所有的组件。这些选项通过Sass变量来处理。通过内置的Gruntfile,可以简单改变一个变量的值,并重新编译。 可用的变量 您可以在_variables.scss文件找到这些变量并自定义这些变量。 变量 值 Description $spacer 1rem (默认), 或者任何大于0的值 为间隔工具指定默认的间隔值

  • 问题内容: 我正在研究Android项目。我有一个prefs.xml代码,像这样 而且我需要自定义首选项布局。我创造了; custom_name_setting_layout.xml 并编写一个SettingActivity.java 我的问题是;我写了setBackgroundColor方法,但是没有用。不起作用的意思是,该程序正在运行而没有错误(例如NullReferenceException