2

私は自分のアプリの1つでスピナーコントロール(コンボボックス/ドロップダウン)を作成してきましたが、次のすべての機能を実現するのがどれほど難しいかを知って驚いていました。

  1. Androidのstrings.xml国際化(I18N)機能を利用して、ユーザー向けの文字列が外部化されます。
  2. スピナーの選択は、システムビューを使用して動作します。これにより、文字列を操作したり、意味のある値にマップしたりする必要がなくなります(yuck)。
  3. ユーザービューからシステムビューへのマッピングは、簡単で自動化され、最小限に抑えられている必要があります(つまり、すべてのコンポーネントを手動でロールする必要はありません)。

他の人はこれに対する解決策を試みましたが、私が見る限り、彼らは以下の問題の1つまたは多くに苦しんでいます。

  1. UIコードは、そこに属していない(乱雑な)列挙型クラスに忍び寄っています。既存のソリューションのほぼすべてがこれに苦しんでいます。
  2. 列挙型クラスの文字列に直面するハードコードされたユーザー。これらは外部化されていないため、Androidの標準機能を使用してI18Nを実行することはできません。
  3. 作成者は通常、フラグメントまたはアクティビティを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.
  }});
4

2 に答える 2

1

を使用しますArrayAdapter<WindLevel>。はい、カスタムの型付きリスナーを作成しましたが、通常のイベントリスナーはを取得しposition、を呼び出しgetItem()て適切に型指定されたArrayAdapter<WindLevel>ものを取得できます。WindLevel

IMHO、Spinnerウィジェットの大部分は、事前に国際化できる静的文字列からの表示値を持つある種の列挙型ではなく、データベース、インターネット、またはその他の動的データソースから読み込まれた素材で埋められます。

これはあなたのコードが役に立たないということではありません:もしあなたがそれが役に立つと思うなら、それは書く価値がありました。Spinnerまた、ターゲットパターンを含むアプリ(つまり、表示値が事前にわかっていて国際化できる列挙型または同等のものに裏打ちされたもの)があり、ソリューションも役立つと思われるアプリがあると確信しています。十分なコードを作成するすべての開発者は、OSまたはフレームワークモデルを開発者自身のメンタルモデルにより適したものにマッピングするのに役立つこれらの種類のヘルパークラスなどを作成します。パフォーマンスの問題を認識していない限り、それはすべて問題ありません。

OnItemSelectedListenerまた、これはインターフェースであることに注意してください。そのインターフェースを既存のクラスに実装することは継承ではありません。

于 2012-09-13T20:14:58.303 に答える
0

誰もあなたに答えなかった理由は:

どのような問題を解決しようとしていますか?スピナーは、うまく設計された試みの前に存在していました。

Androidに存在するのとまったく同じ方法でそれらを再発明するのはなぜですか? http://developer.android.com/guide/topics/ui/controls/spinner.html

それは確かにあなたがデザインした美しいホイールですが、それでもそれはただのホイールです:)

更新: 私はあなたが何をしたかを理解し始めたと思います。これは面白い。ListPreferenceによって実装されたパターンとそのエントリおよびエントリ値に移動しなかった理由がわかりません。
実際、Androidチームがなぜそのルートに進まなかったのか理解できません。

いずれにせよ、Androidフレームワークにアイデアを提案する価値があります。やっぱりオープンソースです。

于 2012-09-07T17:16:08.593 に答える