gpt4 book ai didi

android - 如何使用 android.support.v7.preference 库创建自定义首选项?

转载 作者:IT老高 更新时间:2023-10-28 22:25:38 26 4
gpt4 key购买 nike

我希望至少支持 api 10,我希望能够很好地设置我的偏好,我希望能够拥有标题(或显示 PreferenceScreens)。 AppCompat 的着色不完全支持的 PreferenceActivity 似乎不适合。所以我尝试使用 AppCompatActivityPreferenceFragmentCompat

public class Prefs extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null)
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, new PreferencesFragment())
.commit();
}

public static class PreferencesFragment extends PreferenceFragmentCompat {
@Override public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}

@Override
public void onDisplayPreferenceDialog(Preference preference) {
// the following call results in a dialogue being shown
super.onDisplayPreferenceDialog(preference);
}

@Override public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
// I can probably use this to go to to a nested preference screen
// I'm not sure...
}
}
}

现在,我想创建一个自定义首选项,以提供字体选择。使用 PreferenceActivity,我可以简单地做

import android.preference.DialogPreference;

public class FontPreference extends DialogPreference {

public FontPreference(Context context, AttributeSet attrs) {super(context, attrs);}

@Override protected void onPrepareDialogBuilder(Builder builder) {
super.onPrepareDialogBuilder(builder);
// do something with builder and make a nice cute dialogue, for example, like this
builder.setSingleChoiceItems(new FontAdapter(), 0, null);
}
}

并使用这样的xml来显示它

<my.app.FontPreference android:title="Choose font" android:summary="Unnecessary summary" />

但是现在,android.support.v7.preference.DialogPreference中没有onPrepareDialogBu​​ilder。相反,它已移至 PreferenceDialogFragmentCompat。我几乎没有找到关于如何使用那个东西的信息,而且我不确定如何从 xml 转到显示它。 v14 偏好 fragment 代码如下:

public void onDisplayPreferenceDialog(Preference preference) {
...

final DialogFragment f;
if (preference instanceof EditTextPreference)
f = EditTextPreferenceDialogFragment.newInstance(preference.getKey());
...
f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
}

我尝试继承 android.support.v7.preference.DialogPreference 并让 onDisplayPreferenceDialog 使用类似的代码来实例化一个虚拟 FontPreferenceFragment但它失败了,但有以下异常(exception)。

java.lang.IllegalStateException: Target fragment must implement TargetFragment interface

在这一点上,我已经陷入困境,不想进一步挖掘。 Google 对此异常(exception)一无所知。无论如何,这种方法似乎过于复杂。那么,使用 android.support.v7.preference 库创建自定义首选项的最佳方法是什么?

最佳答案

Important note: Currently (v23.0.1 of the v7 library) there are still a lot of theme-issues with the 'PreferenceThemeOverlay'(see this issue). On Lollipop for example, you end up with Holo-styled category headers.

经过几个令人沮丧的时间后,我终于成功地创建了一个自定义的 v7 首选项。创建自己的Preference似乎比您认为需要的要难。所以一定要花一些时间。

起初您可能想知道为什么会同时找到 DialogPreferencePreferenceDialogFragmentCompat对于每种偏好类型。事实证明,第一个是实际偏好,第二个是 DialogFragment偏好将显示在哪里。遗憾的是,您需要将它们两个子类化。

不用担心,您无需更改任何代码。你只需要重新定位一些方法:

  • 所有首选项编辑方法(如 setTitle()persist*() )都可以在 DialogPreference 中找到类。
  • 所有对话框(编辑)方法(onBindDialogView(View)onDialogClosed(boolean))已移至 PreferenceDialogFragmentCompat .

您可能希望现有的类扩展第一个类,这样您就不必进行太多我认为的更改。自动完成应该可以帮助您找到缺失的方法。

完成上述步骤后,就该将这两个类绑定(bind)在一起了。在您的 xml 文件中,您将引用首选项部分。但是,Android 还不知道是哪个 Fragment当您的自定义偏好需要时,它必须膨胀。因此,您需要覆盖 onDisplayPreferenceDialog(Preference) :

@Override
public void onDisplayPreferenceDialog(Preference preference) {
DialogFragment fragment;
if (preference instanceof LocationChooserDialog) {
fragment = LocationChooserFragmentCompat.newInstance(preference);
fragment.setTargetFragment(this, 0);
fragment.show(getFragmentManager(),
"android.support.v7.preference.PreferenceFragment.DIALOG");
} else super.onDisplayPreferenceDialog(preference);
}

还有你的DialogFragment需要处理“ key ”:

public static YourPreferenceDialogFragmentCompat newInstance(Preference preference) {
YourPreferenceDialogFragmentCompat fragment = new YourPreferenceDialogFragmentCompat();
Bundle bundle = new Bundle(1);
bundle.putString("key", preference.getKey());
fragment.setArguments(bundle);
return fragment;
}

这应该可以解决问题。如果遇到问题,请尝试查看现有的子类,看看 Android 是如何解决它的(在 Android Studio 中:输入类的名称并按 Ctrl+b 以查看反编译的类)。希望对您有所帮助。

关于android - 如何使用 android.support.v7.preference 库创建自定义首选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32621403/

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