Использование listpreference и получение ключа работает, но нет кнопки ok

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

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


person Allan    schedule 25.03.2010    source источник


Ответы (4)


Вы можете клонировать и переопределить 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'.
     */
person CommonsWare    schedule 25.03.2010

Я сделал то, что предложил предыдущий ответ, и реализовал свой собственный ListPreference на основе исходного кода Android. Ниже моя реализация, которая добавляет кнопку 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]+"");
    }

}

Затем вы можете использовать класс в файле preference.xml следующим образом:

<com.yourApplicationName.myPreferenceList
            android:key="yourKey"
            android:entries="@array/yourEntries"
            android:entryValues="@array/yourValues"
            android:title="@string/yourTitle" />
person Techi50    schedule 02.04.2014
comment
Чтобы быть более конкретным: реализует DialogInterface.OnClickListener - person southerton; 17.09.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]+"");
    }
}
person ajinkya    schedule 15.03.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() при нажатии кнопки OK, например:

 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);
        }
    }
person southerton    schedule 17.09.2015