如何实现显示简单是/否确认对话框的首选项?
有关示例,请参阅Browser->Setting->Clear Cache.
我在PreferenceFragment中获取一些自定义DialogPreference子类时遇到了一些麻烦,以便在旋转屏幕时保持可见.我在使用PreferenceActivity时没有遇到这个问题,因此我不知道它是Android错误还是代码问题,但我希望有人确认他们是否有相同的体验.
要对此进行测试,首先要创建一个包含至少一个DialogPreference的首选项屏幕(哪个子类无关紧要).然后在PreferenceActivity中显示它.运行应用程序时,请按DialogPreference以显示其对话框.然后旋转屏幕以使方向发生变化.对话框是否仍然可见?
然后尝试相同,但使用PreferenceFragment显示您的首选项而不是PreferenceActivity.再次,旋转屏幕时对话框是否仍然可见?
到目前为止,我发现如果使用PreferenceActivity,对话框将保持可见,但如果使用PreferenceFragment则不会.查看DialogPreference的源代码,似乎正确的行为是对话框保持可见,因为在屏幕isDialogShowing重定向时onSaveInstanceState()调用时会保存状态信息.因此,我认为一个错误可能会阻止PreferenceFragment(及其中的所有内容)恢复该状态信息.
如果它是Android错误,那么它具有深远的影响,因为任何使用PreferenceFragment的人都无法保存和恢复状态信息.
有人可以确认吗?如果它不是一个错误,那么发生了什么?
android preferenceactivity android-preferences android-fragments dialog-preference
有没有办法DialogPreference在任何事件中获得a的正面按钮?
我想最初禁用它,并在EditText验证后启用它.
我想在第一个应用启动时打开一些首选项(通过扩展DialogPreference来创建).此外,这些偏好用作通常的偏好.
有没有办法实现这个?
编辑:
我有我的自定义偏好,如下所示:
public class CitySelectPreference extends DialogPreference {
// Some code here
}
Run Code Online (Sandbox Code Playgroud)
并且作为解决方案,我希望它从代码中显示,而无需用户进入首选项屏幕.
我试图在一个扩展DialogPreference的类中运行一个半径NumberPicker,我在使setView()工作时遇到了很多麻烦.让我们从一些代码开始:
public class RadiusPickerPreference extends DialogPreference{
public RadiusPickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder builder) {
builder.setTitle(R.string.set_radius_dialog_fragment_title);
builder.setView(R.layout.dialog_radius_picker);
builder.setPositiveButton(android.R.string.ok, null);
builder.setNegativeButton(android.R.string.cancel, null);
}
}
Run Code Online (Sandbox Code Playgroud)
这在builder.setView上给出了一个错误,说"Call需要API 21(当前最小值为15)".我想支持API 15+的设备,因此更改此选项不是一种选择.现在,如果我试图覆盖
protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder builder)
相反,它说"方法不会覆盖其超类的方法".
问题是,我该如何设置视图?它不一定必须在onPrepareDialogBuilder()中,只要它支持API 15+.谢谢!
PS:如果您需要更多代码,请告诉我.要将其显示为XML,只需将其添加到<PreferenceScreen>:
<com.example.project.RadiusPickerPreference
android:id="@+id/radPickerPref"
android:key="@string/pref_key_default_radius"
android:title="@string/pref_title_default_radius"/>
Run Code Online (Sandbox Code Playgroud) 我正在实现我自己的自定义DialogPreference子类,它具有用于持久化整数的SeekBar.我有点困惑什么需要进入onSaveInstanceState()和onRestoreInstanceState().具体来说,您是否需要更新用户与之交互的UI小部件(在我的情况下,是SeekBar小部件)onRestoreInstanceState()?
我感到困惑的原因是这里的API doc文章告诉你这样做:
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
if (isPersistent()) {
return superState;
}
final SavedState myState = new SavedState(superState);
myState.value = mNewValue; //<------------ saves mNewValue
return myState;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state == null || !state.getClass().equals(SavedState.class)) {
super.onRestoreInstanceState(state);
return;
}
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
mNumberPicker.setValue(myState.value); //<------------ updates the UI widget, not mNewValue!
}
Run Code Online (Sandbox Code Playgroud)
但是查看一些官方Android Preference类(EditTextPreference和ListPreference)的源代码,UI小部件不会更新onRestoreInstanceState() …
android state android-widget android-preferences dialog-preference
我正在尝试在我的首选项屏幕中创建一个NumberPicker对话框.我已经在此之后做了一个:https://stackoverflow.com/a/5533295/2442638
但是,对于我的第二个对话框,我只想要一个微调器,所以我调整了代码如下:
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.NumberPicker;
public class SnoozeTPP extends DialogPreference {
private int Minute = 0;
private NumberPicker np= null;
public static int getMinute(String time) {
String[] pieces = time.split(":");
return (Integer.parseInt(pieces[1]));
}
public SnoozeTPP(Context context, AttributeSet attrs) {
super(context, attrs);
setPositiveButtonText("Set");
setNegativeButtonText("Cancel");
}
@Override
protected View onCreateDialogView() {
np = new NumberPicker(getContext());
return (np);
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
np.setMaxValue(60);
np.setValue(Minute);
} …Run Code Online (Sandbox Code Playgroud) 我想创建一个简单的(是/否)对话框首选项,我按照这篇文章中的答案 - 从XML创建一个DialogPreference
但我得到一个错误说
java.lang.IllegalArgumentException: Tried to display dialog for unknown preference type. Did you forget to override onDisplayPreferenceDialog()?
at android.support.v7.preference.PreferenceFragmentCompat.onDisplayPreferenceDialog(PreferenceFragmentCompat.java:647)
at android.support.v7.preference.PreferenceManager.showDialog(PreferenceManager.java:553)
at android.support.v7.preference.DialogPreference.onClick(DialogPreference.java:262)
at android.support.v7.preference.Preference.performClick(Preference.java:1115)
at android.support.v7.preference.Preference.performClick(Preference.java:1100)
at android.support.v7.preference.Preference$1.onClick(Preference.java:170)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Run Code Online (Sandbox Code Playgroud)
我的XML
<android.support.v7.preference.PreferenceCategory android:title="History & privacy">
<com.game.prefs.views.DialogPref
android:key="pref_clear_search"
android:title="Reset Quests"
android:summary="Reset all quest-progress."
android:dialogMessage="Are you sure you wish to reset your quest progress? This action cannot be undone!"
android:positiveButtonText="Clear …Run Code Online (Sandbox Code Playgroud) android illegalargumentexception android-preferences android-dialog dialog-preference
第一个问题.很长一段时间的搜索者.
我通过扩展DialogPreference实现了timePicker首选项,就像在android文档中一样.一切正常,我可以通过onSharedPreferenceChanged()和DialogPreference onSetInitialValue()的覆盖来设置摘要.
我的目标是始终使用其值和来自资源的其他字符串显示摘要.
例如,在我的ListPreference中,我有:
android:summary="@string/pref_list_camera_summary"
Run Code Online (Sandbox Code Playgroud)
解析为:
<string name="pref_list_camera_summary">Use camera: %s</string>
Run Code Online (Sandbox Code Playgroud)
在我的timePreference%s不会扩展.我已经四处搜索,我无法弄清楚如何获得dialogPreference/timePreference来做到这一点.我可以在onSetInitalValue()中手动设置摘要,如下所示:
setSummary(getSummary() + " " + DateFormat.getTimeFormat(getContext()).format(new Date(calendar.getTimeInMillis())));
Run Code Online (Sandbox Code Playgroud)
我只是不喜欢这样的暗示扩张.感觉不干净或使用android%s范例.
我将开始挖掘listPreference代码,看看我如何将它添加到dialogPreference.任何想法/先发制人都会很棒!
谢谢!
我有一个带有“ TimePreference”类的TimePickerDialog首选项,该类扩展了DialogPreference:
public class TimePreference extends DialogPreference{
...
private TimePicker picker=null;
...
public TimePreference(Context ctxt, AttributeSet attrs){
super(ctxt, attrs);
setPositiveButtonText(android.R.string.ok);
setNegativeButtonText(android.R.string.cancel);
}
@Override
protected View onCreateDialogView(){
picker=new TimePicker(getContext());
return(picker);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想添加第三个按钮,它将把首选项设置为当前时间并关闭对话框,如下所示:

问题是,是否可以使用TimePickers进行此操作,还是应该自定义AlertDialog?