我在我的Android应用程序中使用listpreference并获取我的键值,一切都很好并且效果很好(现在你们帮助了我)但是 - 当我的listpreference菜单弹出时,它们只包含一个取消按钮。
假设用户在红色,蓝色和绿色之间进行选择。首次弹出列表首选项对话框时,对话框仅显示取消按钮。因此,只要用户选择了对话框,对话框就会消失。我希望这样当用户选择他们的设置时,他们会看到单选按钮突出显示然后他们继续并单击确定按钮...但我没有确定按钮而无法弄清楚原因。任何帮助都会很棒... al
答案 0 :(得分: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'.
*/
答案 1 :(得分: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" />
答案 2 :(得分: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]+"");
}
}
答案 3 :(得分: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;
}
});
要修复此问题,您需要在单击确定按钮上调用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);
}
}