9

我在我的 android 应用程序中使用 listpreference 并获取我的键值,一切都很好并且运行良好(现在你们已经帮助了我)但是 - 当我的 listpreference 菜单弹出时,它们只包含一个取消按钮。

假设用户在红色、蓝色和绿色之间进行选择。当 listpreference 对话框第一次弹出时,对话框只显示一个取消按钮。因此,一旦用户选择他们的选择,对话框就会消失。我希望这样当用户选择他们的设置时,他们会看到单选按钮被突出显示,然后他们继续点击确定按钮......但我没有确定按钮,不知道为什么。任何帮助都会很棒......人

4

4 回答 4

6

您可以克隆和重新实现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'.
     */
于 2010-03-25T23:11:39.513 回答
6

我已经按照上一个答案的建议做了,并基于 Android 源代码实现了我自己的 ListPreference。下面是我添加 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" />
于 2014-04-02T22:31:12.987 回答
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]+"");
    }
}
于 2015-03-15T07:03:37.090 回答
1

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

要解决此问题,您需要在单击 OK 按钮时调用 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);
        }
    }
于 2015-09-17T09:24:21.643 回答