微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 共享应用常量最佳实践

如何解决Android 共享应用常量最佳实践

我想知道通过应用管理共享常量的最佳做法是什么。 问题是在 View 和 viewmodel 以及 XML 资源文件和 SharedPreferences 中以一致的命名使用它们。

例如,让我们从偏好开始。

@AndroidEntryPoint
class PreferencesAspectFragment : PreferenceFragmentCompat() {

  override fun onCreatePreferences(savedInstanceState: Bundle?,rootKey: String?) {
    setPreferencesFromresource(R.xml.preferences_aspect,rootKey)
  }
}

所以,我们在preferences_aspect.xml中有:

<ListPreference
        app:defaultValue="by_label"
        app:entries="@array/preferences_aspect_sort_order_entries"
        app:entryValues="@array/preferences_aspect_sort_order_values"
        app:key="aspect.sort_order"
        app:title="@string/preferences_aspect_sort_order"
        app:useSimpleSummaryProvider="true" />

我们的键存储在 arrays.xml 中

<string-array name="preferences_aspect_sort_order_values">
        <item>by_label</item>
        <item>by_label_desc</item>
        <item>by_created</item>
        <item>by_created_desc</item>
</string-array>

如果我需要在应用程序中获取存储的偏好值,我需要编写:

val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
val preferencesSort = sharedPreferences.getString("aspect.sort_order","")

如果我想使用它:

when(preferencesSort){
  "by_label" -> sortByLabel()
  "by_label_desc" -> sortByLabelDesc()
  "by_created" -> sortByCreated()
  "by_created_desc" -> sortByCreatedDesc()
  else -> sortByLabel()
}

等等。我使用了很多字符串:

"aspect.sort_order" "by_label" "by_label_desc" "by_created" "by_created_desc"

容易出现拼写错误,而我想使用常量。或者,至少是在一个点上定义的字符串。

我可以像这样创建一个 XML 文件 keys.xml:

<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" tools:ignore="MissingTranslation">
    <string name="key.sort.by_label" translatable="false">
        <xliff:g id="key.sort.by_label">sort.by_label</xliff:g>
    </string>
    <string name="key.sort.by_label_desc" translatable="false">
        <xliff:g id="key.sort.by_label_desc">sort.by_label_desc</xliff:g>
    </string>
</resources>

而不是在其他 XML 文件中使用它:

<string-array name="preferences_aspect_sort_order_values">
        <item>@string/key.sort.by_label</item>
        <item>@string/key.sort.by_label_desc</item>
...

如果我需要在视图中使用这些常量,我可以使用:

getString(R.string.key_sort_by_label)

我根本不喜欢这个解决方案,它不干净,也不简洁,有点混乱。 此外,在 viewmodel 中,我需要参考上下文才能使用 getString,这不是一个好主意。

那么避免所有这些字符串来命名我的常量的最佳方法是什么?

非常感谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。