2010-03-25 3 views
8

Używam listpreference w mojej aplikacji na Androida i otrzymuję moje kluczowe wartości i wszystko jest w porządku i działa dobrze (teraz, gdy mi pomogłeś) ALE - kiedy moje menu listpreference popup, zawierają tylko przycisk anulowania.Używanie listpreferencji i otrzymywanie klucza działa, ale nie ma przycisku OK.

Załóżmy, że użytkownik wybiera między czerwonym, niebieskim i zielonym. Kiedy okno dialogowe listpreferencji pojawia się najpierw, okno dialogowe pokazuje tylko przycisk anulowania. Z tego powodu okno dialogowe znika, gdy tylko użytkownik wybierze swój wybór. Chciałbym, żeby kiedy użytkownik wybierał swoje ustawienia, zobaczył przycisk radiowy podświetlony, a następnie kliknął przycisk OK ... ale nie mam przycisku OK i nie mogę zrozumieć dlaczego. Każda pomoc będzie niesamowite ... al

Odpowiedz

6

można sklonować i reimplement ListPreference pracować tak, jak chcesz, tworzyć własne niestandardowe Preference klasę wyniku.

Jednakże, jest skonfigurowany tak, aby używać tylko przycisku ujemnego ("Anuluj"). Jako kod źródłowy mówi:

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

Zrobiłem co sugerował poprzedni odpowiedź i wdrożone własne ListPreference na podstawie kodu źródłowego Androida. Poniżej znajduje się moja implementacja, która dodaje przycisk OK.

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

} 

Następnie można użyć klasy w preference.xml następująco:

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

Aby być bardziej konkretne: implementuje DialogInterface.OnClickListener – southerton

4

Kod przez techi50 jest poprawna, ale nie działa na „przycisk Anuluj ". Oto niektóre modyfikacja:

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

Proponowana przez Techi50 i Ajinkya rozwiązanie działa OK. Jednakże, jeśli posiadasz także OnPreferenceChangeListener, to nie uruchomi się.

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

         //Won't get there 

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

Aby to naprawić trzeba wywołać funkcję callChangeListener() na OK kliknięcia przycisku, tak:

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