3

より良い質問のタイトルが思いつきませんでした:(

私のアプリケーションでは、毎回1つの質問で、10以上の質問を持つ質問者のようなものが必要です。

私がしたことは次のとおりです。

  1. 1 つのアクティビティに MainActivity を指定し、その onCreate() に Frag_1 という Fragment をプログラムで追加します。

  2. Frag_1には、アクティビティへのコールバックを取得して、どのオプションがクリックされたかなどを知るためのonButtonClickedListenerメソッドを備えたインターフェイスがあります..onClicked

  3. このインターフェイスのメソッド onClicked を MainActivity に実装し、そのメソッドで Fragment を Frag_2 に変更しました (2 番目の質問) など。

問題は:

最終的に 10 個のフラグメントがあり、MainActivity はこれらのフラグメントのそれぞれに 10 個のインターフェイスを実装しています。将来的には、30 ~ 40 の質問があるかもしれません。

編集:

すべての質問が似ているわけではありません。質問の回答オプションは EditText/Spinner/RadioButtons などです。そのため、同じ Fragment を使用できず、質問と回答のオプション Text を変更するだけです。

これにアプローチするためのより良い、より効率的な方法はありますか

ありがとうございました

4

1 に答える 1

1

あなたはほとんどそこにいます。MainActivity を実装するためのより広範な/汎用的なインターフェイスを作成します。多分そのようなものpublic void fragClickCallback(int fragId, Bundle data);

そうすれば、実装時にswitch() caseどの質問からのものかを知ることができ、バンドルはさまざまなタイプの回答に対してさまざまなキーをパックできます(ラジオボタン/スピナーのint、オープン回答の文字列など)。

.replace(...)そして、前にフラグメントを削除するために使用するすべてのフラグメントトランザクションで確認してください。

編集

さらに、何十億ものフラグメントを作成する必要がないように、フラグメントを構築するための賢い方法がいくつかあります。質問の種類はいくつありますか? 数えてみましょう:

  • 複数選択 (単一回答) -> 整数 (インデックス)
  • 複数選択 (複数回答) -> 整数 (フラグ)
  • 数値入力 -> float/double
  • テキストの編集 -> 文字列
  • 日付ピッカー -> 長い (エポック)
  • タイムピッカー -> 3 つの整数 (?)

6 つのフラグメントと を処理する 6 つの方法がありますswitch statement。今はフラグメントに適切なパラメーターを渡すだけです。

編集:

  @Override
   public void onSaveInstanceState(Bundle outState) {
       super.onSaveInstanceState(outState);
       outState.putInt("curChoice", mCurCheckPosition);
   }

そして、あなたの Fragment ActivityCreated() で

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
        // Restore last state for checked position.
        mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
    }
}

これらのコードはhttp://developer.android.com/reference/android/app/Fragment.htmlからコピーされました。そのページをさらに読むことをお勧めします。この例ではカーソル位置を復元していますが、これを使用して以前のユーザーの回答 (テキスト、整数、浮動小数点数など) を復元できます。

于 2012-10-16T08:10:55.247 に答える