我希望至少支持API 10,我希望能够漂亮地自定义偏好设置,我希望能够拥有标题(或显示PreferenceScreen
)。看起来PreferenceActivity
在AppCompat
的着色方面不被完全支持,不能满足我的需要。因此,我正在尝试使用AppCompatActivity
和PreferenceFragmentCompat
。
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
中已经没有onPrepareDialogBuilder
。相反,它已经移动到PreferenceDialogFragmentCompat
中。我发现关于如何使用这个东西的信息很少,而且我不确定该如何从xml转换为显示它。v14 preference 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
,但是它会出现以下异常。
java.lang.IllegalStateException: Target fragment must implement TargetFragment interface
我已经深陷其中,不想再深挖了。谷歌对这个异常一无所知。总之,这种方法似乎过于复杂。那么,使用android.support.v7.preference库创建自定义首选项的最佳方法是什么?