【问题标题】:Android: support %s expansion in DialogPreference summaryAndroid:在 DialogPreference 摘要中支持 %s 扩展
【发布时间】:2014-03-15 16:20:08
【问题描述】:

第一个问题。长期搜索。

我通过扩展 DialogPreference 实现了 timePicker 首选项,就像在 android 文档中一样。一切正常,我可以通过 onSharedPreferenceChanged() 设置摘要,也可以在 DialogPreference onSetInitialValue() 的覆盖中设置摘要。

我的目标是始终显示摘要它的值和来自资源的一些其他字符串。
例如在我的 ListPreference 我有:

android:summary="@string/pref_list_camera_summary"

解析为:

<string name="pref_list_camera_summary">Use camera: %s</string>

在我的 timePreference %s 中没有得到扩展。我四处搜索,但我不知道如何让 dialogPreference/timePreference 做到这一点。 我可以像这样在 onSetInitalValue() 中手动设置摘要:

setSummary(getSummary() + " " + DateFormat.getTimeFormat(getContext()).format(new Date(calendar.getTimeInMillis())));

我只是不喜欢这样的隐含扩展。感觉不干净或使用 android %s 范例。

我将开始挖掘 listPreference 代码,看看如何将它添加到 dialogPreference。任何想法/先发制人都会很棒!

谢谢!

【问题讨论】:

    标签: java android string android-preferences dialog-preference


    【解决方案1】:

    如果你想用android:summary中定义的%s自动替换首选字符串,我认为没有这种可能。您应该在初始化您的偏好时以编程方式处理它。您是否尝试过使用String.format() 来避免+ 串联?

    String date = DateFormat.getTimeFormat(getContext())
            .format(new Date(calendar.getTimeInMillis()));
    
    setSummary(String.format(Locale.getDefault(), 
            getContext().getString(R.string.pref_list_camera_summary), date));
    

    【讨论】:

    • 问题在于,getSummary() 一开始就没有被调用。如果你能以某种方式调整派生的偏好类以确保它被调用,你确实可以使用string.format() 技巧。
    • 如果你想在偏好活动/片段中初始化摘要,通常的做法是在 onResume 方法中进行。另一种方法是在您的自定义首选项类的onBindViewHolder 中执行初始化任务。在那里调用getSummary()方法是可行的。
    • 在我的例子中,当从首选项概述中调用 onBindViewHolder(PreferenceViewHolder holder) 方法时,绑定为 null。因此,无法获取应该替换 %s 容器的值。
    • 不确定要分享什么。鉴于摘要设置为%s,因此需要将派生的DialogPreference 覆盖 getSummary() 并相应地格式化文本。第一个问题是 getSummary() 甚至没有被调用。显然,派生类需要一些逻辑,我假设有人自 2014 年以来已经实现了这些逻辑。因此是赏金:)
    • 我创建了一个自定义 DialogPreference 并覆盖了 getSummary() 方法。它被正确调用并在首选项中显示最重要的摘要。您可以共享自定义首选项类的摘要相关部分。
    【解决方案2】:

    如果你使用库Material Preference,你可以轻松做到:

    listPreference.summaryFormatter = { entry, value -> "Value for $entry is $value" }
    

    它会将您的ListPreference 的摘要设置为每周价值为 7

    我知道这个答案与您的问题没有太大关系。但至少,你找到了一个可以做到这一点的库。使用 Material Preference,您不必将 %s 设置为 ListPreference 的摘要。

    【讨论】:

    • 这是DialogPreference :/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多