2010-03-25 2 views
8

Ich benutze listpreference in meiner Android App und bekomme meine Schlüsselwerte und alles ist gut und funktioniert gut (jetzt, dass Sie mir geholfen haben) ABER - wenn meine Listpräferenzmenüs Popup, sie enthalten nur eine Abbrechen-Schaltfläche.Verwenden von listpreference und bekommen den Schlüssel funktioniert aber keine OK-Taste

Nehmen wir an, der Benutzer wählt zwischen Rot, Blau und Grün. Wenn das Listenvorgabedialogfeld zum ersten Mal angezeigt wird, zeigt das Dialogfeld nur eine Abbrechen-Schaltfläche an. Aus diesem Grund verschwindet der Dialog, sobald der Benutzer seine Auswahl trifft. Ich möchte es so, dass, wenn der Benutzer ihre Einstellung wählt, sie den Radioknopf markiert sehen und dann gehen sie voran und klicken den OK-Knopf ... aber ich habe keinen OK-Knopf und kann nicht herausfinden, warum. Irgendwelche Hilfe würde fantastisch sein ... al

Antwort

6

Sie können ListPreference klonen und neu implementieren, um zu arbeiten, wie Sie wollen, Ihre eigene benutzerdefinierte Preference Klasse als ein Ergebnis machend.

ist jedoch so eingerichtet, dass nur eine negative Schaltfläche ("Cancel") verwendet wird. Da der Quellcode sagt:

/* 
    * 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

ich getan habe, was die vorherige Antwort vorgeschlagen und meine eigene ListPreference implementiert basierend auf Android-Quellcode. Unten ist meine Implementierung, die den OK-Button hinzufügt.

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]+""); 
    } 

} 

Dann können Sie die Klasse in Ihrem preference.xml wie folgt verwendet werden:

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

Um genauer zu sein: implementiert DialogInterface.OnClickListener – southerton

4

Der Code von techi50 ist richtig, aber funktioniert nicht für ‚Löschtaste ". Hier sind einige Änderung:

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

Die vorgeschlagene Lösung von Techi50 und Ajinkya ok funktioniert. Wenn Sie jedoch auch den OnPreferenceChangeListener haben, wird er nicht ausgelöst.

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

         //Won't get there 

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

Um dies zu beheben, müssen Sie die callChangeListener() Funktion auf OK klicken, wie diese aufzurufen:

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); 
     } 
    } 
Verwandte Themen