私は自分のアプリの1つでスピナーコントロール(コンボボックス/ドロップダウン)を作成してきましたが、次のすべての機能を実現するのがどれほど難しいかを知って驚いていました。
- Androidのstrings.xml国際化(I18N)機能を利用して、ユーザー向けの文字列が外部化されます。
- スピナーの選択は、システムビューを使用して動作します。これにより、文字列を操作したり、意味のある値にマップしたりする必要がなくなります(yuck)。
- ユーザービューからシステムビューへのマッピングは、簡単で自動化され、最小限に抑えられている必要があります(つまり、すべてのコンポーネントを手動でロールする必要はありません)。
他の人はこれに対する解決策を試みましたが、私が見る限り、彼らは以下の問題の1つまたは多くに苦しんでいます。
- UIコードは、そこに属していない(乱雑な)列挙型クラスに忍び寄っています。既存のソリューションのほぼすべてがこれに苦しんでいます。
- 列挙型クラスの文字列に直面するハードコードされたユーザー。これらは外部化されていないため、Androidの標準機能を使用してI18Nを実行することはできません。
- 作成者は通常、フラグメントまたはアクティビティをOnItemSelectedListenerにします。これは、構成がより適切な場合に、便宜上、継承の一般的な問題を永続させます。
私はこれを行う独自のソリューションを開発しました:http ://www.androidanalyse.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.
}});