मैं एक ListPreference
जो कुछ इस तरह दिखाई है।ListPreference निर्भरता
क्या मैं इसे android:dependency
के साथ किसी भी तरह से पूरा कर सकता हूं? कुछ android:dependency="itemList:item3"
धन्यवाद!
मैं एक ListPreference
जो कुछ इस तरह दिखाई है।ListPreference निर्भरता
क्या मैं इसे android:dependency
के साथ किसी भी तरह से पूरा कर सकता हूं? कुछ android:dependency="itemList:item3"
धन्यवाद!
इस तरह से कुछ ऐसा करने का एकमात्र तरीका प्रोग्रामेटिक रूप से है।
आपको ListPreference पर एक परिवर्तन श्रोता सेट अप करना होगा और फिर दूसरे को सक्षम/अक्षम करना होगा।
itemList = (ListPreference)findPreference("itemList");
itemList2 = (ListPreference)findPreference("itemList2");
itemList.setOnPreferenceChangeListener(new
Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String val = newValue.toString();
int index = itemList.findIndexOfValue(val);
if(index==3)
itemList2.setEnabled(true);
else
itemList2.setEnabled(false);
return true;
}
});
यदि मैं आप थे तो पहली बार ठीक से सेट नहीं होने पर मैं दूसरी वरीयता भी नहीं दिखाऊंगा। ऐसा करने के लिए आपको वरीयता को मैन्युअल रूप से घोषित करना होगा (एक्सएमएल में नहीं) और इसे सक्षम/अक्षम करने के बजाय इसे जोड़ें/हटाएं।
अब यह सबसे अच्छा जवाब नहीं है जिसे आपने कभी देखा है ?!
एम्मानुएल
उपवर्ग ListPreference
वर्ग, और ओवरराइड setValue
और shouldDisableDependence
तरीकों।
setValue
super.setValue
के बाद notifyDependencyChange(shouldDisableDependents())
पर कॉल करेगा जब मूल्य वास्तव में बदल जाएगा।
shouldDisableDependence
केवल तभी झूठा लौटाता है जब वर्तमान मान item3 है, या mDepedenceValue
में संग्रहीत कोई अन्य वांछित मान।
@Override
public void setValue(String value) {
String mOldValue = getValue();
super.setValue(value);
if (!value.equals(mOldValue)) {
notifyDependencyChange(shouldDisableDependents());
}
}
@Override
public boolean shouldDisableDependents() {
boolean shouldDisableDependents = super.shouldDisableDependents();
String value = getValue();
return shouldDisableDependents || value == null || !value.equals(mDepedenceValue);
}
मैंने @ वाटरड्रैगन समाधान को संपादित करने का प्रयास किया लेकिन यह "सहकर्मी खारिज कर दिया गया" था। निश्चित नहीं है कि क्यों यह अभी भी उसका समाधान है लेकिन एक ठोस उदाहरण प्रदान करता है।
सबक्लास ListPreference
कक्षा, और setValue
और shouldDisableDependence
विधियों को ओवरराइड करें।
setValue
super.setValue
के बाद notifyDependencyChange(shouldDisableDependents())
पर कॉल करेगा जब मूल्य वास्तव में बदल जाएगा।
shouldDisableDependence
केवल तभी झूठा लौटाता है जब वर्तमान मान item3 है, या mDepedenceValue
में संग्रहीत कोई अन्य वांछित मान। अपने attrs.xml
package xxx;
import android.content.Context;
import android.content.res.TypedArray;
import android.preference.ListPreference;
import android.util.AttributeSet;
import xxx.R;
public class DependentListPreference extends ListPreference {
private final String CLASS_NAME = this.getClass().getSimpleName();
private String dependentValue = "";
public DependentListPreference(Context context) {
this(context, null);
}
public DependentListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
if (attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DependentListPreference);
dependentValue = a.getString(R.styleable.DependentListPreference_dependentValue);
a.recycle();
}
}
@Override
public void setValue(String value) {
String mOldValue = getValue();
super.setValue(value);
if (!value.equals(mOldValue)) {
notifyDependencyChange(shouldDisableDependents());
}
}
@Override
public boolean shouldDisableDependents() {
boolean shouldDisableDependents = super.shouldDisableDependents();
String value = getValue();
return shouldDisableDependents || value == null || !value.equals(dependentValue);
}
}
अद्यतन:
<attr name="dependentValue" format="string" />
<declare-styleable name="DependentListPreference">
<attr name="dependentValue" />
</declare-styleable>
और अपनी पसंद एक्सएमएल किसी अन्य वरीयता है कि यह इस पर निर्भर करता करने के लिए इसे टाई के अंदर:
<xxx.DependentListPreference
android:key="pref_key_wifi_security_type"
android:title="Wi-Fi Security Type"
app:dependentValue="1"
android:entries="@array/wifi_security_items"
android:entryValues="@array/wifi_security_values" />
<EditTextPreference
android:key="pref_key_wifi_security_key"
android:title="WPA2 Security Key"
android:summary="Tap to set a security key"
android:password="true"
android:dependency="pref_key_wifi_security_type" />
मैं एक अंग पर बाहर जाना होगा और कहें कि मैंने कभी देखा है कि यह सबसे अच्छा जवाब है। –
@Emmanuel: itemList और itemList2 चर को अंतिम घोषित किया जाना चाहिए। वैसे भी, मैंने मतदान किया, क्योंकि आपका जवाब मेरे लिए बहुत अच्छा काम करता है! –
क्या आइटम सूची 2 * छुपे हुए * बूलियन मान (एक प्राथमिकता जो वरीयता स्क्रीन पर दिखाई नहीं दे रही है) पर निर्भर हो सकती है, और फिर उपरोक्त कोड में इस छिपे हुए मान को सही या गलत पर सेट करें? प्रभाव वही होगा, लेकिन मुझे लगता है कि यदि आइटम आइटम (केवल एक के बजाय) के आधार पर आपकी कई प्राथमिकताएं थीं तो यह थोड़ा और सुविधाजनक होगा। यदि संभव हो, तो आप इस मूल्य को कैसे छुपा सकते हैं? – Malabarba