首页 > 解决方案 > 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,这不是一个好主意。

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

非常感谢

标签: androidxmlkotlinconstantssharedpreferences

解决方案


推荐阅读