当用户编辑字段中的值时,自定义 DatePicker 作为首选项不会保留值

2024-02-20

我创建了一个 DatePickerPreference,即我扩展了 DialogPreference 并在内部创建了一个 DatePicker 对象,并且让它几乎完美地工作。当您单击向上和向下箭头时,它会更改值并保存您选择的值。

但是,如果您单击字段内部并在其中键入新值,它不会保存更新的值!使用箭头时,始终会调用 onDateChanged() 方法;当用户输入字段并编辑它时,如果他选择另一个字段,它只会调用 onDateChanged (在这种情况下,如果他编辑最后一个字段并单击“确定”,则最后一次编辑将被忽略)。我找到Eric Besette 在他的 TimePickerPreference 中发布了类似的问题 http://www.ebessette.com/d/TimePickerPreference#comment-367

这是我的代码:


    public class DatePickerPreference extends DialogPreference implements  
OnDateChangedListener, OnDateSetListener {

    @Override
    protected View onCreateDialogView() {
        DatePicker picker = new DatePicker(getContext());
        mDate = getPersistedLong(System.currentTimeMillis());

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(mDate);

        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);

        picker.init(year, month, day, this);
        return picker;
    }

    public void onDateChanged(DatePicker view, int year, int monthOfYear,  
            int dayOfMonth) {
        mDate = (new Date(year - 1900, monthOfYear, dayOfMonth)).getTime();
    }

    public void onDateSet(DatePicker view, int year, int monthOfYear,  
            int dayOfMonth) {
        onDateChanged(view, year, monthOfYear, dayOfMonth);
    }

    @Override
    public void setDefaultValue(Object defaultValue) {
        super.setDefaultValue(String.valueOf((  
            new Date(String.valueOf(defaultValue))).getTime()));
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);

        if(positiveResult) {
            if(isPersistent()) {
                persistLong(mDate);
            }
            callChangeListener(String.valueOf(mDate));
        }
    }

    public int getYear() { /*(...)*/ }
    public int getMonth() { /*(...)*/ }
    public int getDay() { /*(...)*/ }

    public DatePickerPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public DatePickerPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void init() { setPersistent(true); }
    public void setDate(Date date) { mDate = date.getTime(); }
    public void setDate(long milisseconds) { mDate = milisseconds; }

    public String getDate(int style) {
        return DateFormat.getDateInstance(style).format(new Date(mDate));
    }

    public long getDate() { return mDate; }

    private long mDate;
    public static final int DATE_SHORT = DateFormat.SHORT;
    public static final int DATE_MEDIUM = DateFormat.MEDIUM;
    public static final int DATE_LONG = DateFormat.LONG;
    public static final int DATE_FULL = DateFormat.FULL;
    public static final int DATE_DEFAULT = DateFormat.DEFAULT;
}

由于该类扩展了DialogPreference类,它已经处理改变SharedPreference使用按钮。要在用户输入新日期后正确更新日期变量,您需要更新SharedPreference手动。

您可以按如下方式执行此操作:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor preferences = prefs.edit();
preferences.putLong("mdate_key", mDate.getTime());
preferences.commit();

这里,mdate_key将对应于DatePickerPreference中使用的密钥PreferenceActivityXML 文件。

我建议要么这样做onDateChanged() or onDestroy().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当用户编辑字段中的值时,自定义 DatePicker 作为首选项不会保留值 的相关文章

  • 发生存储异常。无法在firebase中上传图片

    在我能够更改图像并将其上传到 firebase 之前 这段代码就可以工作 但现在我突然收到此错误 我不知道问题是什么 public class SettingsActivity extends AppCompatActivity priva
  • 如何在android中点击画布上绘制的圆圈?

    我正在开发一个人脸检测应用程序 在这个应用程序中 我必须在脸上的眼睛和嘴巴用户可以点击拖动圆圈 在检测到的人脸上根据自己设置位置 因此 所有圆圈都已成功绘制在脸上 但我无法单击特定圆圈并使用缩小选项在整个脸上移动 请建议我有关相同问题的正确
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • fresco 的 Proguard 错误

    我正在使用 ProGuard 当我在发布配置中运行项目时 出现以下错误 Warning com facebook imagepipeline bitmaps DalvikBitmapFactory can t find referenced
  • Android 构建 gradle 在特定设备上失败

    我面临一个奇怪的问题 当我编译我的应用程序以在 Android 7 0 的设备上运行它时 它可以工作 但是当我尝试为 Android 4 2 1 的设备进行编译时 它会失败并出现以下错误 错误 任务 app transformClasses
  • Sqlite 查询检查 - 小于和大于

    return mDb query DATABASE TABLE new String KEY ROWID KEY LEVEL KEY LEVEL gt 3 lt 5 null null null null 我究竟做错了什么 它返回的值全部高
  • 如何使用 (a)smack 在 Android 上保持 XMPP 连接稳定?

    我使用适用于 Android 的 asmack android 7 beem 库 我有一个后台服务正在运行 例如我的应用程序保持活动状态 但 XMPP 连接迟早会在没有任何通知的情况下消失 服务器表示客户端仍然在线 但没有发送或接收数据包
  • Android,让文本切换器成为中心?

    如何集中我的文本切换器 我尝试过设置重力 但似乎不起作用 ts setFactory new ViewFactory public View makeView TextView t new TextView this t setTypefa
  • 如何从静态快捷方式启动活动的现有实例

    我的应用程序中有一个活动 MainActivity 并且有一个静态快捷方式 指向 TempActivity 由于静态快捷方式将始终设置 FLAG ACTIVITY NEW TASK 和 FLAG ACTIVITY CLEAR TASK 因此
  • 不使用 CookieManager 的 Android 会话 cookie

    我的应用程序进行多次网络调用以获得身份验证 我需要将此会话存储在 cookie 中 我想使用 Cookie Manager 但经过一些研究后 我发现它仅适用于 API 9 及更高版本 并且我的应用程序需要向后兼容 我使用 HTTPURLCo
  • Android,语言文件不起作用

    我现在正在创建一个 Android 应用程序 并尝试为我的母语添加语言文件 但在某种程度上 这对我不起作用 我尝试在两部不同的手机中加载该应用程序 但结果相同 之前创建过语言文件 效果良好 但这次不行 手机设置为瑞典语 语言文件适用于我创建
  • Twitter 集成期间获取访问令牌函数行为不当

    我只是想使用 twitter4j 从我的 Android 应用程序向 Twitter 分享文本 首先 我尝试的是我创建了一个新项目 并且这个特定的代码运行成功 然后我在我的应用程序中混合了该特定代码 登录 Twitter 成功完成 之后我发
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • 在Android的activity中调用onResume

    在活动的过程中通过调用 this OnResume 强制 onResume 事件可以吗 或者我应该实现另一个由 OnResume 和第一个成员调用的过程 实现在您的重写中调用的另一个过程onResume 后者不打算由您调用 它是一种方便的方
  • Android 将菜单项在操作栏中向左对齐

    我的应用程序中有一个操作栏 它显示我定义的菜单项res menu activity main xml 我的菜单项在操作栏上向右对齐 我希望它们左对齐 我为此找到的唯一解决方案使用了自定义操作栏 如下所示 将菜单项放置在 Honeycomb
  • 如何使用asynctask显示倒计时的进度条?

    在我的应用程序中 我希望用户按下按钮 然后等待 5 分钟 我知道这听起来很糟糕 但就这样吧 5 分钟等待期间的剩余时间应显示在进度条中 我使用带有文本视图的 CountDownTimer 来倒计时 但我的老板想要看起来更好的东西 这就是进度
  • 我可以在主线程上读取一个小 txt 文件,还是应该始终避免那里的 I/O?

    我正在读取一个小的 json 文件 其中有几行 它存储在用户设备的内部应用程序文件夹中 我所做的就是这样 JSONObject jsonObject new JSONObject MyUtils inputStreamToString My
  • Exif 方向标签返回 0

    我正在开发一个自定义相机应用程序 我面临以下问题 当我尝试使用检索方向时ExifInterface 它总是返回 0 ORIENTATION UNDEFINED 这使我无法将图像旋转到正确的状态 从而无法正确显示 我使用示例代码来设置相机旋转
  • 在android中的日期选择器对话框中显示当前日期

    我多次尝试在日期选择器对话框中显示当前日期 但失败了 它显示 1 1 1990 我已经遵循了堆栈溢出的一些答案 但不幸的是这些对我不起作用 谁能解释一下在日期选择器对话框中显示当前日期的代码 谢谢 It may help you publi
  • RecyclerView元素更新+异步网络调用

    我有一个按预期工作的回收视图 我的布局中有一个按钮可以填充列表 该按钮应该进行异步调用 根据结果 我更改按钮的外观 这一切都发生得很好 但是 当我单击按钮并快速向下滚动列表时 异步调用的结果会更新新视图的按钮 代替旧视图的视图 我该如何处理

随机推荐

  • 将 cocos2d 视图添加到 UIView

    我已将 cocos2d 2 0 集成到现有的 iOS 项目中 并希望能够创建一个视图并将其作为子视图添加到现有视图中 cocos2d 设置代码应该放在哪里以及 cocos2d 视图如何在 UIView 中可见 我已关注雷 文德利希教程 ht
  • Excel 工作簿输入时出现奇怪的错误

    对于当前代码 String currentPath Directory GetCurrentDirectory OpenFileDialog op new OpenFileDialog op InitialDirectory current
  • C# 错误提供程序不适用于组框和选项卡控件中的文本框

    我正在尝试使用错误提供程序来实现 以在继续执行之前验证我的文本框不为空 错误提供程序适用于主窗体上的文本框 但拒绝适用于组框或选项卡控件中的任何文本框或组合框 它不检查文本框 不显示错误或等待用户为正在检查的控件输入文本 选择项目 当然 如
  • 为什么双击单元格时下面的代码不会执行?

    下面的代码较早运行 但在双击单元格时不会执行 Private Sub Worksheet DoubleClick ByVal Target As range Cancel As Boolean If Target Font Bold Fal
  • 如何在 Android 中显示希腊字符?

    如何在 Android 中显示希腊字符 Android 具有完整的 Unicode 支持 显示希腊字符应该非常容易 在 strings xml 文件中 您可以使用希腊字符 这些字符将正确显示 当然 您需要以 UTF 8 格式保存文件
  • 名称 php 的表单验证,包括撇号、空格、连字符和句点

    我很难将正确的表达式组合在一起 因此它会拒绝除字母 句点 撇号 空格和连字符之外的所有内容 到目前为止 这适用于除撇号之外的所有内容 我尝试使用单 和双 来转义撇号 但无济于事 if preg match a zA Z POST name
  • 计算熊猫奇数比的更好方法

    我有一个数据框 counts1 如下所示 Factor w statin wo statin AgeGroups Cancer 0 5 No 108 6575 Yes 0 223 11 15 No 5 3669 Yes 1 143 16 2
  • 在活动映射 xml 中膨胀类片段时出错

    这个项目以前曾经运行过 运行应用程序时 我不断收到 InflateException 04 01 12 16 36 102 14895 14895 com example ali googleandroid E AndroidRuntime
  • 单击鼠标添加图像? Java小程序

    当鼠标单击时 如何在鼠标坐标上添加图像 我看过这个 将鼠标单击时的图像添加到 JPanel https stackoverflow com questions 19769061 adding images on mouse click to
  • 之间的区别:在 Intellij IDEA 中构建和制作

    对于Intellij IDEA中的JAVA EE项目 有什么区别 重建项目并创建项目 在菜单 构建 中 谢谢 您可以参考https www jetbrains com help idea 2016 2 compilation types h
  • MySql - Sequelize - 无法添加外键约束

    我正在尝试使用 Nodejs Sequelize 创建数据库 被调用的命令是 CREATE TABLE IF NOT EXISTS wheel id INTEGER NOT NULL auto increment createdAt DAT
  • Silverlight 绑定到布尔属性值的逆

    我想将控件可见性绑定到布尔属性值的倒数 我有一个属性 CanDownload 如果它是 true 那么我想隐藏文本框 反之亦然 我怎样才能实现这个目标 Thanks 被问到这样的问题so经常和答案so类似我认为是时候对所有 好吧可能是 大多
  • 根据两个条件对多个表进行排序的宏

    我徒劳地尝试让下面的宏正确运行 最终目标是一个宏 它将根据两个条件对多个表 在单个工作表上 进行排序 并且也适用于任何活动的工作表 我可以使用精确的表引用创建一个宏 但寻求更灵活的方法以避免每个工作表都有一个宏 我的大部分代码来自 Doug
  • 如何使用 VBA 将 & 符号从 Excel 文件写入 XML 文件?

    首先 对于 VBA 来说 我是一个完全的新手 但不幸的是我被抛弃了这段代码 我必须处理它 该应用程序的作用是复制 Excel xlsm 文件中的信息并将其粘贴到 XML 文件中以供进一步处理 问题是 一切都进行得很顺利 直到我在 Excel
  • 关于 Angular 中的位置更改

    有没有办法检测 AngularJS 中的全局位置变化 而不仅仅是单个控制器 我的目标是检测每个位置变化 或者有什么有效的方法来观察 window location href 的变化 routeChangeSuccess 据我了解仅适用于单个
  • ByteBuffer.wrap(byte[]) 会导致长时间运行的应用程序内存泄漏吗?

    我试图在网上搜索 但没有找到答案 基于java doc http docs oracle com javase 7 docs api java nio ByteBuffer html wrap byte 5B 5D ByteBuffer w
  • HasResolution 类型类

    我刚刚查了一下HasResolution 类型类 https hackage haskell org package base 4 10 1 0 docs Data Fixed html t HasResolution它有一个单一的方法 r
  • 为什么 .NET 中的多维数组比普通数组慢?

    Edit 我向大家道歉 当我实际上想说 多维数组 时 我使用了术语 锯齿状数组 如下面的示例所示 对于使用了错误的名字 我深表歉意 我实际上发现锯齿状数组比多维数组更快 我已经添加了锯齿状阵列的测量值 I was trying to use
  • 带棱镜的 AutoWirePartialView 不起作用或使用不当?

    我正在尝试使用棱镜7 1AutoWirePartialView绑定一个PartialView到它的 viewModel 但是 绑定不起作用 或者至少将 viewModel 设置为PartialView似乎不起作用 它仍然具有页面的 Bind
  • 当用户编辑字段中的值时,自定义 DatePicker 作为首选项不会保留值

    我创建了一个 DatePickerPreference 即我扩展了 DialogPreference 并在内部创建了一个 DatePicker 对象 并且让它几乎完美地工作 当您单击向上和向下箭头时 它会更改值并保存您选择的值 但是 如果您