AndroidX中的自定义ListPreference



我已经定制了我的Android应用程序设置页面,我使用API 21或26。我添加了一个从ListPreference继承的CustomListPreference java类,并将其集成到SettingActivity中。

但是,我重新列出了系统不起作用,因为SettingActivity有从androidx.preference.PreferenceFragmentCompat继承的Setting片段,用于Setting Activity的包如下:

  • androidx.proference.preference
  • androidx.preference.ListPreference
  • androidx.preference.PreferenceFragmentCompat

如果我的自定义ListPreference使用android.preference.preference和android.prreference.ListPreference包,当android为设置活动创建对象时,我的所有代码都将停止工作。它在自定义ListPreference构造之后崩溃,错误为">膨胀类com.signatact.doorl.dialog.preference.AppListPreference时出错"。深入研究细节,我发现了崩溃的原因,因为Setting Activity创建新对象的最后一步是转换为androidx.preference.preference:

来自首选充气程序.java:

import androidx.preference;
...
return (Preference) constructor.newInstance(args); // line 242

很明显,系统在android.preference.preferenceandroidx.preference.之间切换时失败

然而,如果我将我的自定义ListPreference文件实现移动到androidx,我以前用于自定义的几乎所有方法都不可用,下面是不可用的方法列表,我将自定义逻辑放在这里:

//错误:方法不会覆盖其超类中的方法

@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder)
...
@Override
protected void onDialogClosed(boolean positiveResult)

看起来谷歌戏剧性地改变了他们的API,有人能想到如何在AndroidX中自定义ListPreference吗?一般来说,我需要以下标准定制的东西:

  • 在一行中,我有一组自定义控件(3个控件-2个文本框和1个复选框(-我在onPrepareDialogBuilder中用我的自定义ArrayAdapter为列表的每一行构建了一个自定义布局
  • 我需要动态更新CustomListPreference值。我在SettingActivity中的onResume中填充这些值
  • 当按下列表并选择新值时,我需要获得回调

我在这里只找到了一个适用于我的案例的实用指南,如下所示:如何更改ListPreference对话框的外观,但它是有限且简短的。我分析了AndroidX API,看起来我需要更多的时间来提出解决方案,因此任何帮助/想法都值得赞赏。。。

Thx,Vlad。

只需覆盖onClick((函数,即可弹出具有自定义布局的AlertDialog。请记住,在对话框中选择任何内容时都要调用setValue((。

public class ColorPreference extends ListPreference {

private CharSequence[] mEntries;
private CharSequence[] mEntryValues;
private String mValue;
private String mSummary;

private AlertDialog mDialog;
public ColorPreference(Context context) {
this(context, null);
}
public ColorPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setDefaultValue(Options.DEFAULT_PRIMARY_COLOR_STRING);
}

@Override
protected void onClick() {
mEntries = getEntries();
mEntryValues = getEntryValues();
mSummary = getSummary().toString();
mValue = getValue();

mClickedDialogEntryIndex = findIndexOfValue(mValue);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setSingleChoiceItems(new ColorAdapter(getContext(), R.layout.pref_color_item),mClickedDialogEntryIndex,null);

mDialog = builder.create();
mDialog.show();
}
}

最新更新