使用列表首选项,并获得关键的作品,但没有确定的button

我在我的android应用程序中使用listpreference和获取我的关键值,一切都很好,工作良好(现在你们已经帮了我)但是 – 当我的列表首选项菜单popup,他们只包含一个取消button。

假设用户select红色,蓝色和绿色。 当列表首选项对话框popup时,对话框只显示一个取消button。 因此,只要用户select他们的select,对话框就会消失。 我想这样,当用户select他们的设置,他们看到单选button被突出显示,然后他们继续前进,然后单击确定button…但我没有一个确定的button,不知道为什么。 任何帮助将是真棒… …

Solutions Collecting From Web of "使用列表首选项,并获得关键的作品,但没有确定的button"

您可以克隆和重新实现ListPreference以您想要的方式工作,从而创build您自己的自定义Preference类。

但是, ListPreference设置为仅使用否定(“取消”)button。 正如源代码所说:

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

我已经完成了以前的答案build议,并基于Android源代码实现了我自己的ListPreference。 下面是我的实现添加确定button。

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

techi50的代码是正确的,但不适用于'取消button'。 这里有一些修改:

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

Techi50和ajinkya提出的解决scheme工作正常。 但是,如果您也有OnPreferenceChangeListener它不会触发。

  yourListPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object o) { //Won't get there preference.setSummary(o.toString()); return true; } }); 

为了解决这个问题,你需要调用OKbutton点击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); } }