2010-03-25 11 views
8

मैं अपने एंड्रॉइड ऐप में सूची वरीयता का उपयोग कर रहा हूं और मेरे मुख्य मूल्य प्राप्त कर रहा हूं और सब ठीक है और अच्छा काम करता है (अब जब आपने लोगों की मदद की है) लेकिन जब मेरी सूची वरीयता मेनू पॉपअप, उनमें केवल एक रद्द बटन होता है।सूची वरीयता का उपयोग करना और कुंजी काम करना, लेकिन कोई ठीक बटन नहीं

मान लें कि उपयोगकर्ता लाल, नीले और हरे रंग के बीच चयन कर रहा है। जब सूची वरीयता संवाद पहले पॉप-अप होता है, तो संवाद केवल एक रद्द बटन दिखाता है। इसके कारण, जैसे ही उपयोगकर्ता अपनी पसंद का चयन करता है, संवाद संवाद गायब हो जाता है। मुझे यह पसंद है कि जब उपयोगकर्ता अपनी सेटिंग चुनता है, तो वे रेडियो बटन को हाइलाइट करते देखते हैं और फिर वे आगे बढ़ते हैं और ठीक बटन पर क्लिक करते हैं ... लेकिन मेरे पास एक अच्छा बटन नहीं है और यह पता नहीं लगा सकता है कि क्यों। कोई मदद अद्भुत होगी ... अल

उत्तर

6

परिणामस्वरूप आप अपना खुद का कस्टम Preference कक्षा बनाकर अपनी इच्छानुसार काम करने के लिए ListPreference क्लोन और पुन: कार्यान्वित कर सकते हैं।

हालांकि, ListPreference केवल एक नकारात्मक ("रद्द करें") बटन का उपयोग करने के लिए सेट अप किया गया है। जैसा कि स्रोत कोड कहता है:

/* 
    * The typical interaction for list-based dialogs is to have 
    * click-on-an-item dismiss the dialog instead of the user having to 
    * press 'Ok'. 
    */ 
6

मैंने पिछले जवाब का सुझाव दिया है और एंड्रॉइड स्रोत कोड के आधार पर अपनी खुद की ListPreference लागू किया है। नीचे मेरा कार्यान्वयन है जो ठीक बटन जोड़ता है।

myPreferenceList.java

import android.app.AlertDialog.Builder; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.preference.ListPreference; 
import android.util.AttributeSet; 


public class myPreferenceList extends ListPreference implements OnClickListener{ 

    private int mClickedDialogEntryIndex; 

    public myPreferenceList(Context context, AttributeSet attrs) { 
     super(context, attrs); 


    } 

    public myPreferenceList(Context context) { 
     this(context, null); 
    } 

    private int getValueIndex() { 
     return findIndexOfValue(this.getValue() +""); 
    } 


    @Override 
    protected void onPrepareDialogBuilder(Builder builder) { 
     super.onPrepareDialogBuilder(builder); 

     mClickedDialogEntryIndex = getValueIndex(); 
     builder.setSingleChoiceItems(this.getEntries(), mClickedDialogEntryIndex, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       mClickedDialogEntryIndex = which; 

      } 
     }); 

     System.out.println(getEntry() + " " + this.getEntries()[0]); 
     builder.setPositiveButton("OK", this); 
    } 

    public void onClick (DialogInterface dialog, int which) 
    { 
     this.setValue(this.getEntryValues()[mClickedDialogEntryIndex]+""); 
    } 

} 

तो फिर तुम वर्ग अपने preference.xml में इस प्रकार का उपयोग कर सकते हैं:

<com.yourApplicationName.myPreferenceList 
      android:key="yourKey" 
      android:entries="@array/yourEntries" 
      android:entryValues="@array/yourValues" 
      android:title="@string/yourTitle" /> 
+0

अधिक विशिष्ट होना करने के लिए: लागू करता DialogInterface.OnClickListener – southerton

4

techi50 द्वारा कोड सही है, लेकिन 'रद्द करें बटन के लिए काम नहीं करता है '।

protected void onPrepareDialogBuilder(Builder builder) { 
    super.onPrepareDialogBuilder(builder); 

    prevDialogEntryIndex = getValueIndex();  // add this 
    mClickedDialogEntryIndex = getValueIndex(); 
    builder.setSingleChoiceItems(this.getEntries(), mClickedDialogEntryIndex, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
      mClickedDialogEntryIndex = which; 

     } 
    }); 

    builder.setPositiveButton("OK", this); 
} 

public void onClick (DialogInterface dialog, int which) 
{ 
// when u click Cancel: which = -2; 
// when u click  OK: which = -1; 

    if(which == -2){ 
     this.setValue(this.getEntryValues()[prevDialogEntryIndex]+""); 
    } 
    else { 
     this.setValue(this.getEntryValues()[mClickedDialogEntryIndex]+""); 
    } 
} 
1

समाधान Techi50 और अजिंक्य द्वारा प्रस्तावित ठीक काम करता है: यहाँ कुछ संशोधन कर रहे हैं। हालांकि, अगर आपके पास OnPreferenceChangeListener भी है तो यह आग नहीं लगेगा।

yourListPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
        @Override 
        public boolean onPreferenceChange(Preference preference, Object o) { 

         //Won't get there 

         preference.setSummary(o.toString()); 
         return true; 
        } 
       }); 

इसे ठीक करने के आप, ठीक बटन क्लिक करने पर ही callChangeListener() फ़ंक्शन को लागू करने की जरूरत है इस तरह:

public void onClick (DialogInterface dialog, int which) { 
     if(which == -2) { 
      this.setValue(this.getEntryValues()[mClickedDialogEntryIndexPrev]+""); 
     } 
     else { 
      String value = this.getEntryValues()[mClickedDialogEntryIndex] + ""; 
      this.setValue(value); 
      callChangeListener(value); 
     } 
    } 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^