मैं कम से कम एपीआई 10 का समर्थन करना चाहता हूं, मैं अपनी वरीयताओं को अच्छी तरह से स्टाइल करने में सक्षम होना चाहता हूं, मैं हेडर (या PreferenceScreen
एस दिखाने के लिए) सक्षम होना चाहता हूं। ऐसा लगता है कि PreferenceActivity
, पूरी तरह से AppCompat
के रंग द्वारा समर्थित नहीं है, फिट नहीं होगा। तो मैं AppCompatActivity
और PreferenceFragmentCompat
का उपयोग करने की कोशिश कर रहा हूं।मैं 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...
}
}
}
अब, मैं एक कस्टम वरीयता बनाना चाहता हूं जो फ़ॉन्ट की पसंद प्रदान करेगी। 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);
}
}
करते हैं और इसे
<my.app.FontPreference android:title="Choose font" android:summary="Unnecessary summary" />
प्रदर्शित करने के लिए इस जैसे एक्सएमएल का उपयोग लेकिन अब, वहाँ android.support.v7.preference.DialogPreference
में कोई onPrepareDialogBuilder
है सकता है। इसके बजाय, इसे PreferenceDialogFragmentCompat
पर ले जाया गया है। मुझे उस चीज़ का उपयोग करने के बारे में बहुत कम जानकारी मिली, और मुझे यकीन नहीं है कि एक्सएमएल से इसे प्रदर्शित करने के लिए कैसे जाना है।
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
का दृष्टांत के लिए कोड का एक समान टुकड़ा का उपयोग, लेकिन यह निम्न अपवादों के साथ विफल रहता होने की कोशिश की: v14 वरीयता टुकड़ा निम्नलिखित कोड है।
java.lang.IllegalStateException: Target fragment must implement TargetFragment interface
इस बिंदु पर मैं पहले से ही गंदगी में बहुत गहरा हूं और आगे खोदना नहीं चाहता हूं। Google इस अपवाद के बारे में कुछ नहीं जानता है। वैसे भी, यह विधि अत्यधिक जटिल लगती है। तो, android.support.v7.preference लाइब्रेरी का उपयोग कर कस्टम प्राथमिकताओं को बनाने का सबसे अच्छा तरीका क्या है?
लगभग एक सही समाधान! मुझे यह समझने में थोड़ी देर लग गई कि डिस्प्ले प्रेफरेंसियल को प्राथमिकता खंड में अधिभारित करने की आवश्यकता है (जो वरीयता फ़्रेममेंट कॉम्पेट प्राप्त करता है)। आपका बहुत बहुत धन्यवाद! –
इसे पढ़ने वाले किसी के लिए बस एक नोट: यदि आपको PreferencesDialogFragmentCompat.java:57/58 में ClassCastException मिलता है, तो सुनिश्चित करें कि आपका बंडल.पुटस्ट्रिंग ("कुंजी", वरीयता.getKey()); लाइन ऊपर के रूप में "कुंजी" कहते हैं। अन्यथा, getArguments() प्राप्त करें। GetString (ARG_KEY) ClassCastException के साथ विफल हो जाएगा। – MCLLC
यदि आपके पास कोई पूर्ण उदाहरण है तो क्या आप एक पूर्ण उदाहरण पोस्ट कर सकते हैं? मैं नए समर्थन प्राथमिकताओं को लागू करने में सफल रहा, लेकिन संवादप्रणाली एक नाइटमेयर हैं। Google इसके बारे में कोई दस्तावेज प्रदान नहीं करता है। –