Использование списка предпочтений и получение ключа работает, но нет кнопки ОК - PullRequest
9 голосов
/ 26 марта 2010

Я использую listpreference в своем приложении для Android и получаю значения ключей, и все хорошо и работает хорошо (теперь, когда вы, ребята, помогли мне), НО - когда всплывают мои списковые меню, они содержат только кнопку отмены. *

Допустим, пользователь выбирает между красным, синим и зеленым. Когда всплывающее диалоговое окно listpreference появляется, в диалоговом окне отображается только кнопка отмены. Из-за этого диалог исчезает, как только пользователь выбирает свой выбор. Мне бы хотелось, чтобы, когда пользователь выбирает свою настройку, он увидел, что радио-кнопка подсвечена, а затем они нажимают кнопку ОК ... но у меня нет кнопки ОК, и я не могу понять, почему. Любая помощь будет потрясающей ... al

Ответы [ 4 ]

6 голосов
/ 03 апреля 2014

Я сделал то, что предлагал предыдущий ответ, и реализовал свою собственную ListPreference на основе исходного кода Android. Ниже моя реализация, которая добавляет кнопку ОК.

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" />
6 голосов
/ 26 марта 2010

Вы можете клонировать и переопределять ListPreference, чтобы работать так, как вы хотите, создавая в результате свой собственный класс Preference.

Однако, 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'.
     */
4 голосов
/ 15 марта 2015

Код от 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 голос
/ 17 сентября 2015

Решение, предложенное Techi50 и ajinkya, работает нормально. Однако, если у вас также есть 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);
        }
    }
...