我一直在我的一个应用程序中创建微调器控件(组合框/下拉菜单),并且惊讶地发现实现以下所有功能是多么困难:
- 面向用户的字符串被外部化,利用了 Android 的 strings.xml 国际化 (I18N) 功能。
- 微调器选择使用系统视图进行操作,这有助于不必使用字符串或将字符串映射到有意义的值 (yuck)。
- 用户视图到系统视图的映射应该简单、自动化和最小化(即不是为每个组件手动滚动)。
其他人已尝试解决此问题,但据我所知,他们普遍存在以下一个或多个问题:
- UI 代码正在蔓延到他们不属于那里的枚举类(混乱),几乎所有现有的解决方案都受此影响。
- 在其枚举类中硬编码面向用户的字符串。因为这些不是外部化的,所以您不能使用现有的 Android 功能进行 I18N。
- 作者通常将 Fragment 或 Activity 设为 OnItemSelectedListener,这会延续一个常见的继承问题,以方便使用,其中组合更合适。
我已经开发了自己的解决方案:http ://www.androidanalysis.com/android-spinner-externalize-user-strings-mapped-to-system-enum/
我的问题是,我错过了什么吗?这似乎不应该这么难(这让我觉得我可能正在重新发明轮子)。
下面是一些示例代码,显示了我正在使用的解决方案(可从上面的链接获得 Apache 2 许可证)。
String none = getString(R.string.none);
String light = getString(R.string.light);
String medium = getString(R.string.medium);
String strong = getString(R.string.strong);
SpinnerUtil.createNewSpinner(view, R.id.wind, Arrays.asList(none, light, medium, strong), WindLevel.values(),
new SpinnerItemSelectedListener<WindLevel>() {
public void onItemSelected(Spinner item, WindLevel value) {
// Take whatever action you wish to here.
}});