Voglio supportare almeno api 10, voglio essere in grado di definire le mie preferenze in modo gradevole, voglio essere in grado di avere intestazioni (o di mostrare PreferenceScreen
s). Sembra che PreferenceActivity
, non completamente supportato dalla colorazione AppCompat
, non si adatti. Quindi sto cercando di usare AppCompatActivity
e PreferenceFragmentCompat
.Come posso creare preferenze personalizzate usando la libreria android.support.v7.preference?
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...
}
}
}
Ora, voglio creare una preferenza personalizzata che fornirà la scelta di un font. Con PreferenceActivity
, si potrebbe semplicemente fare
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);
}
}
e utilizzare XML come questo per visualizzarlo
<my.app.FontPreference android:title="Choose font" android:summary="Unnecessary summary" />
Ma ora, non c'è onPrepareDialogBuilder
in android.support.v7.preference.DialogPreference
. Invece, è stato spostato su PreferenceDialogFragmentCompat
. Ho trovato poche informazioni su come usare quella cosa, e non sono sicuro di come passare da xml a visualizzarlo. v14 preferenza frammento ha il seguente codice:
public void onDisplayPreferenceDialog(Preference preference) {
...
final DialogFragment f;
if (preference instanceof EditTextPreference)
f = EditTextPreferenceDialogFragment.newInstance(preference.getKey());
...
f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
}
ho provato sottoclassi android.support.v7.preference.DialogPreference
ed avente onDisplayPreferenceDialog
utilizzare un pezzo simile di codice per istanziare un manichino FontPreferenceFragment
ma non riesce con le seguenti eccezioni.
java.lang.IllegalStateException: Target fragment must implement TargetFragment interface
A questo punto io sono già troppo in profondità nel disordine e non voglio scavare ulteriormente. Google non sa nulla di questa eccezione. Ad ogni modo, questo metodo sembra essere eccessivamente complicato. Quindi, qual è il modo migliore per creare preferenze personalizzate usando la libreria android.support.v7.preference?
Quasi una soluzione perfetta! Mi ci è voluto un po 'per capire che onDisplayPreferenceDialog doveva essere sovrascritto nel frammento delle preferenze (che eredita PreferenceFragmentCompat). Molte grazie! –
Solo una nota per chi legge questo: se ottieni un ClassCastException in PreferenceDialogFragmentCompat.java:57/58, assicurati che il tuo bundle.putString ("chiave", preference.getKey()); linea dice "chiave" come sopra. In caso contrario, getArguments(). GetString (ARG_KEY) avrà esito negativo con ClassCastException. – MCLLC
Potresti per favore postare un esempio completo se ne hai uno? Sono riuscito a implementare le nuove preferenze di supporto, ma le DialogPreferences sono un incubo. Google non fornisce alcuna documentazione a riguardo. –