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,这不是一个好主意。
那么避免所有这些字符串来命名我的常量的最佳方法是什么?
非常感谢