java - 首选项屏幕中的自定义列表首选项对话框布局,带有自定义列表项
问题描述
当我单击设置活动中的 ListPreference 时,我想创建一个自定义列表对话框。
root_preferences.xml 中的 ListPreference:
<ListPreference
android:icon="@drawable/pref_language"
app:defaultValue="en"
app:entries="@array/language_entries"
app:entryValues="@array/language_values"
app:iconSpaceReserved="false"
app:key="@string/prefkey_language"
app:summary="%s"
app:title="@string/language_title" />
我希望它有圆角,并且我还想要自定义列表项视图(例如图像而不是默认单选按钮)。
实际结果:
预期结果:
我可以使用 ListPreference 的方式执行此操作,但用适配器替换 @array 条目吗?
有没有其他方法可以在不需要摆脱 PreferenceScreen 的情况下实现这一点?
解决方案
同时,我找到了解决方案。它可能不是最干净的,但它对我有用。如果有人知道更好的解决方案,请随时告诉我们。
创建一个扩展 DialogPreference 的类。创建与您想要的自定义对话框一样多的类,例如LanguagePreference、UnitPreference等。
public class LanguagePreference extends DialogPreference implements Preference.OnPreferenceChangeListener { public LanguagePreference(Context context, AttributeSet attrs) { super(context, attrs); setOnPreferenceChangeListener(this); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // do something return true; } }
现在您可以在 root_preferences.xml 中使用这些。
<PreferenceCategory app:title="@string/category"> <com.company.yourapp.preferences.LanguagePreference android:icon="@drawable/pref_language" app:title="@string/language" /> <com.company.yourapp.preferences.UnitPreference android:icon="@drawable/pref_unit" app:title="@string/unit" /> </PreferenceCategory>
创建一个扩展 DialogFragment 的类(可能是抽象的)。删除 onViewCreated() 中的默认背景和标题。
public abstract class RoundedPreferenceDialog extends DialogFragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { if (getDialog() != null && getDialog().getWindow() != null) { getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); // remove default background so that dialog can be rounded getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); // remove default title } super.onViewCreated(view, savedInstanceState); } }
从RoundedPreferenceDialog扩展类,例如LanguagePreferenceDialog、UnitPreferenceDialog。
public class LanguagePreferenceDialog extends RoundedPreferenceDialog { public static LanguagePreferenceDialog newInstance() { return new LanguagePreferenceDialog(); } @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.dialogpreference_language, container, false); // init UI, list adapter, listeners return view; } }
覆盖 SettingsFragment 中的 onDisplayPreferenceDialog。为您拥有的每个自定义对话框创建一个条件。
@Override public void onDisplayPreferenceDialog(Preference preference) { if (preference instanceof LanguagePreference) { // rounded language dialog LanguagePreferenceDialog.newInstance().show(getParentFragmentManager(), null); } else if (preference instanceof UnitPreference) { // rounded unit dialog UnitPreferenceDialog.newInstance().show(getParentFragmentManager(), null); } else { super.onDisplayPreferenceDialog(preference); } }
现在您可以显示自定义对话框而不是默认对话框。你只需要按照你想要的方式定制它。要使其圆润,请将根布局的背景设置为自定义圆角布局。
dialogpreference_language.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialogLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_dialog_rounded">
<!-- titleTextView, languageListView, cancelButton, etc. -->
</RelativeLayout>
bg_dialog_rounded.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/dialog_radius" />
<solid android:color="@color/white" />
</shape>
- 在您的 listitem 布局文件中设置列表项的样式,例如listitem_language.xml,它在适配器中膨胀。(以下示例中的 ImageView+TextView。)
最后结果:
推荐阅读
- python - 安装psychopy的问题-错误:命令'swig.exe'失败或无法连接到无
- ios - TabView 内部的不同 UIView
- cplex - 为什么我的解决方案为 sum(n in order) 提供与 sum(n in order:(n-1) in order) 相同的值
- android - CardView 背景颜色在 API 21 中显示为红色
- php - Gate 将身份验证模型设置为使用自定义保护时身份验证回调的第二个参数
- java - 为什么gradle不能按平台获取版本
- angular - 在 Webdatarocks 中保存列和行配置
- php - php合并数组中的重复值
- sql - 使用 SQL 更新 Clob 值
- android - Groupie Android 聊天应用程序,更新特定索引项