Я хочу поддерживать хотя бы api 10, я хочу хорошо стилизовать свои настройки, я хочу иметь заголовки (или показать PreferenceScreen
s). Похоже, что 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 имеет следующий код:
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
В этот момент я уже слишком глубоко погружаюсь в беспорядок и не хочу копать дальше. Google ничего не знает об этом исключении. В любом случае, этот метод кажется слишком сложным. Итак, какой лучший способ создать пользовательские настройки с помощью библиотеки android.support.v7.preference?