मेरे पास एक ऐसी गतिविधि है जो वरीयता सक्रियता को बढ़ाती है। मैं xml फ़ाइल से वरीयताओं को लोड कर रहा हूं। लेकिन कुछ मामलों में मुझे अपने ऐप स्थिति के आधार पर स्क्रीन से वरीयताओं में से एक को पूरी तरह छिपाने की ज़रूरत है। एक सेट सक्षम विधि है, लेकिन यह वही नहीं है जो मैं चाहता हूं। मैं स्क्रीन से उस वरीयता को पूरी तरह से हटाना चाहता हूं। क्या यह संभव है?स्क्रीन से प्राथमिकता को हटाएं/छुपाएं
उत्तर
(PreferenceScreen
एक PreferenceCategory
, या) के लिए एक संदर्भ दोनों Preference
, और उसकी मूल है, तो अपने Preference
एक PreferenceCategory
में है, तो यह करने के लिए है:
एक्सएमएल:
<PreferenceCategory
android:key="category_foo"
android:title="foo">
<CheckBoxPreference
android:key="checkPref" />
जावा:
+०१२३५१६४१०CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);
निष्पक्ष होने के लिए, उपर्युक्त उत्तर कहता है कि आपको मूल 'प्राथमिकता श्रेणी' की आवश्यकता है। – matt
मामले में जहां पसंद वरीयता स्क्रीन का एक सीधा बच्चा है, यहाँ कुछ स्टैंड-अलोन कोड है:
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
यदि प्राथमिकता श्रेणी के भीतर स्थित है तो यह काम नहीं करेगा। आपको श्रेणी के लिए 'प्राप्यता' ढूंढनी है, और श्रेणी – MBH
@MBH से वरीयता को हटा देना है: उस चेतावनी का उल्लेख करने के लिए धन्यवाद! –
आप कुछ है कि गतिशील रूप से एक SwitchPreference पर उदाहरण के लिए वरीयता बदल जाएगा चाहते हैं , मैंने पाया है कि मेरे सभी उप विकल्पों को दो श्रेणी के कंटेनरों में रखना सबसे अच्छा तरीका है। प्रारंभ में आपके पास दिखाए गए सबकुछ होंगे, फिर आप उन बिट्स को हटा दें जिन्हें आप नहीं चाहते हैं। चालाक बिट, क्या आप कुछ बदलते समय फिर से पुन: उत्पन्न करते हैं और फिर आपको मैन्युअल रूप से कुछ भी बनाने या सही क्रम में चीजों को वापस लाने की चिंता करने की आवश्यकता नहीं होती है।
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne");
PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo");
SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref");
PreferenceScreen screen = getPreferenceScreen();
if (mySwitchPref.isChecked()) {
screen.removePreference(prefCatOne);
} else {
screen.removePreference(prefCatTwo);
}
}
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("mySwitchPref")) {
this.recreate();
}
}
केवल नकारात्मक पक्ष यह है कि मैं इस के साथ देख सकते हैं, एक फ्लैश स्क्रीन के रूप में खरोंच से निर्मित किया गया है नहीं है।
मामला काम नहीं करता है, कम से कम 22 में नहीं। लेकिन इसे प्राथमिकता में बदलना (भले ही यह वरीयताओं का समूह है) काम करता है। – Rob
रोब, मैंने अभी एपीआई 22 एवीडी में उपरोक्त कोड का परीक्षण किया है और यह ठीक काम कर रहा है। सुनिश्चित करें कि आपकी वरीयता एक्सएमएल सामग्री आपके कोड से मेल खाती है। उपर्युक्त उदाहरण के लिए SwitchPreference कहीं भी हो सकता है, लेकिन आपको वरीयता श्रेणी की प्राथमिकताएं होने के लिए वरीयता श्रेणियों की आवश्यकता है। – James
मुझे अभी श्रेणी को प्राथमिकता, कोई कलाकार नहीं मिला है, और इसे हटा दिया गया है। काम किया। – Rob
आप मूल्यांकन करना चाहते हैं, और कहा कि मुखौटा के आधार पर, एक विकल्प हो सकता है/(सी deseas evaluar, वाई एन आधार एक eso Ocultar, ऊना Alternativa puede ser):
SwitchPreference autenticacionUsuario = (SwitchPreference) findPreference("key_autenticacion_usuario");
final EditTextPreference Username = (EditTextPreference) findPreference("key_username_mqtt");
final EditTextPreference Password = (EditTextPreference) findPreference("key_password_mqtt");
if (!autenticacionUsuario.isChecked()) {
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("category_mqtt");
preferenceCategory.removePreference(Username);
preferenceCategory.removePreference(Password);
}
यह सब होना चाहिए भीतर/(तोदो esto डेबे ir Dentro):
सार्वजनिक स्थैतिक कक्षा PrefsFragment फैली PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
क्षमा करें, लेकिन यह एक अंग्रेजी साइट है। क्या आप अंग्रेजी में जवाब दे सकते हैं? –
बेशक मेरा इरादा उन लोगों को भी प्रदान करना था जो अंग्रेजी नहीं बोलते –
@ गुस्तावोएडर्डोबेल्डुमा तो आपको यह http://meta.stackoverflow.com/a/297680/545026 पढ़ने की आवश्यकता हो सकती है –
यहाँ यह करने के लिए एक सामान्य तरीका है कि भले काम करता है वरीयता PreferenceCategory
या PreferenceScreen
के तहत है।
private void removePreference(Preference preference) {
PreferenceGroup parent = getParent(getPreferenceScreen(), preference);
if (parent == null)
throw new RuntimeException("Couldn't find preference");
parent.removePreference(preference);
}
private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) {
for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) {
Preference child = groupToSearchIn.getPreference(i);
if (child == preference)
return groupToSearchIn;
if (child instanceof PreferenceGroup) {
PreferenceGroup childGroup = (PreferenceGroup)child;
PreferenceGroup result = getParent(childGroup, preference);
if (result != null)
return result;
}
}
return null;
}
मैं वी 7 वरीयता का उपयोग करने की सलाह देता हूं, यह सेट (दृश्य) सेट है। लेकिन मैंने अभी तक कोशिश नहीं की है। तदनुसार आप PreferenceActivity https://developer.android.google.cn/reference/android/support/v7/preference/Preference.html#setVisible(boolean)
के बजाय PreferenceFragment उपयोग करने के लिए अपने एक्सएमएल फ़ाइल में है:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="preferenceScreen">
<PreferenceCategory
android:key="personalisation"
android:title="your title here">
<ThemedPreference
android:key="animation" />
</PreferenceScreen>
अपने कोड में:
PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation");
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation");
pPreferenceScreen.removePreference(pCategory); //remove category
pCategory.removePreference(pThemePref); // remove preference
मैं भी इस बारे में उत्सुक हूँ। –