0

私は少し立ち往生しています。まず、スクリーンショットを投稿してから質問します。

出力


いくつかの楕円がチェックされていることがわかります。私がしたことは、2 セットの画像を維持することでした。ユーザーがクリックすると、白い画像が黒くなります。
今、私はこの解答用紙から答えを集める必要があり、その方法を知りたい. というメソッドを試しましたgetImageResource()が、存在しません。どうすればいいのか教えてください。

コード:

 public class QuizActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
RelativeLayout r2;
// Global variable(s)
int[][] quizData; // Storing the quiz specifications in an integer array
int[][] questionImages = {
        { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d,
                R.drawable.e, R.drawable.f, R.drawable.g, R.drawable.h,
                R.drawable.i, R.drawable.j },
        { R.drawable.a_checked, R.drawable.b_checked, R.drawable.c_checked,
                R.drawable.d_checked, R.drawable.e_checked,
                R.drawable.f_checked, R.drawable.g_checked,
                R.drawable.h_checked, R.drawable.i_checked,
                R.drawable.j_checked },
        { R.drawable.zero, R.drawable.one, R.drawable.two,
                R.drawable.three, R.drawable.four, R.drawable.five,
                R.drawable.six, R.drawable.seven, R.drawable.eight,
                R.drawable.nine, R.drawable.decimal },
        { R.drawable.zero_checked, R.drawable.one_checked,
                R.drawable.two_checked, R.drawable.three_checked,
                R.drawable.four_checked, R.drawable.five_checked,
                R.drawable.six_checked, R.drawable.seven_checked,
                R.drawable.eight_checked, R.drawable.nine_checked,
                R.drawable.decimal_checked } };

// End
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Beginning of variable declarations
    ScrollView s1 = new ScrollView(this);
    RelativeLayout r1 = new RelativeLayout(this);
    r2 = r1;
    File quizSpecs = new File("mnt/sdcard/teacher_1.csv"); // Read the file
    BufferedReader csvReader = null;
    String line = ""; // Storing each line in a string
    StringTokenizer currentLine = null;
    int noOfQuestions = 0; // Number of questions in the quiz
    int time = 0; // Duration of the quiz
    int i = 0, j = 0, k = 0; // Loop variables
    int previd = 0;
    // End of variable declarations

    try {
        csvReader = new BufferedReader(new FileReader(quizSpecs));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        line = csvReader.readLine();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    currentLine = new StringTokenizer(line, ",");
    noOfQuestions = Integer.parseInt(currentLine.nextToken());
    time = Integer.parseInt(currentLine.nextToken());
    // System.out.println(noOfQuestions + " " + time);
    while (currentLine.hasMoreTokens()) {
        currentLine.nextToken();
    }
    quizData = new int[noOfQuestions][6];
    for (i = 0; i < noOfQuestions; i++) {
        try {
            line = csvReader.readLine();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        currentLine = new StringTokenizer(line, ",");
        for (j = 0; j < 6; j++) {
            quizData[i][j] = Integer.parseInt(currentLine.nextToken());
            // System.out.println(quizData[i][j]);
        }
    }
    try {
        csvReader.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    for (i = 0; i < noOfQuestions; i++) {
        TextView questionNo = new TextView(this);
        questionNo.setText(String.valueOf(i + 1));
        questionNo.setId(1000 * (i + 1));
        questionNo.setTextSize(18);
        RelativeLayout.LayoutParams p1 = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        p1.addRule(RelativeLayout.BELOW, previd);
        previd = (1000 * (i + 1));
        questionNo.setLayoutParams(p1);
        r1.addView(questionNo, p1);
        switch (quizData[i][1]) {
        case 1:
        case 2:
            for (j = 0; j < quizData[i][2]; j++) {
                ImageView option = new ImageView(this);
                option.setImageResource(questionImages[0][j]);
                option.setId((1000 * (i + 1)) + j + 1);
                option.setOnClickListener(this);
                /*
                 * if (j >= quizData[i][2]) {
                 * option.setVisibility(View.INVISIBLE);
                 * option.setEnabled(false); }
                 */
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT);
                params.addRule(RelativeLayout.BELOW, ((1000 * i) + 1));
                params.addRule(RelativeLayout.RIGHT_OF,
                        ((1000 * (i + 1)) + j));
                previd = ((1000 * (i + 1)) + j);
                option.setLayoutParams(params);
                r1.addView(option, params);
            }
            break;
        case 3:
            for (j = 0; j < (quizData[i][3] == 0 ? quizData[i][2]
                    + quizData[i][3] : quizData[i][2] + quizData[i][3] + 1); j++) {
                for (k = 10; k > -1; k--) {
                    ImageView num = new ImageView(this);
                    num.setImageResource(questionImages[2][10 - k]);
                    num.setId((1000 * (i + 1)) + (100 * j) + k + 1);
                    num.setOnClickListener(this);
                    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT,
                            RelativeLayout.LayoutParams.WRAP_CONTENT);
                    if (j == 0) {
                        params.addRule(RelativeLayout.RIGHT_OF,
                                (1000 * (i + 1)));
                    } else {
                        params.addRule(RelativeLayout.RIGHT_OF,
                                (1000 * (i + 1)) + (100 * (j - 1)) + k + 1);
                    }
                    if (k == 10) {
                        params.addRule(RelativeLayout.BELOW, (1000 * i) + 1);
                    } else {
                        params.addRule(RelativeLayout.BELOW,
                                ((1000 * (i + 1)) + (100 * j) + k + 2));
                    }
                    num.setLayoutParams(params);
                    r1.addView(num, params);
                }
            }
            previd = (1000 * (i + 1)) + 1;
            break;
        case 4:
        case 5:
            for (j = quizData[i][2] - 1; j > -1; j--) {
                for (k = 0; k < quizData[i][3]; k++) {
                    ImageView match = new ImageView(this);
                    match.setImageResource(questionImages[0][k]);
                    match.setId((1000 * (i + 1)) + (100 * j) + k + 1);
                    match.setOnClickListener(this);
                    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT,
                            RelativeLayout.LayoutParams.WRAP_CONTENT);
                    if (k == 0) {
                        params.addRule(RelativeLayout.RIGHT_OF,
                                (1000 * (i + 1)));
                    } else {
                        params.addRule(RelativeLayout.RIGHT_OF,
                                (1000 * (i + 1)) + (100 * j) + k);
                    }
                    if (j == quizData[i][2] - 1) {
                        params.addRule(RelativeLayout.BELOW, (1000 * i) + 1);
                    } else {
                        params.addRule(RelativeLayout.BELOW,
                                (1000 * (i + 1)) + (100 * (j + 1)) + k + 1);
                    }
                    match.setLayoutParams(params);
                    r1.addView(match, params);
                }
            }
            previd = (1000 * (i + 1)) + 1;
            break;
        }
    }
    s1.addView(r1, new LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.FILL_PARENT));
    this.setContentView(s1);
}

public void onClick(View v) {
    // TODO Auto-generated method stub
    // Beginning of variable declarations
    int clickedButton = v.getId();
    int questionNo = clickedButton / 1000; // Finding the question number
    int i = 0; // Loop variable
    int rowNo = (clickedButton / 100) % 10;
    // System.out.println(questionNo);
    // System.out.println(quizData[questionNo - 1][1]);
    switch (quizData[questionNo - 1][1]) {
    case 1:
        for (i = 0; i < quizData[questionNo - 1][2]; i++) {
            ImageView option = new ImageView(this);
            option.setImageResource(questionImages[0][i]);
            option.setId((1000 * questionNo) + i + 1);
            option.setOnClickListener(this);
            /*
             * if (i >= quizData[questionNo - 1][2]) {
             * option.setVisibility(View.INVISIBLE);
             * option.setEnabled(false); }
             */
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.BELOW,
                    ((1000 * (questionNo - 1)) + 1));
            params.addRule(RelativeLayout.RIGHT_OF,
                    ((1000 * questionNo) + i));
            option.setLayoutParams(params);
            r2.addView(option, params);
        }
        ImageView option = new ImageView(this);
        option.setImageResource(questionImages[1][(clickedButton % 10) - 1]);
        option.setId((1000 * questionNo) + (clickedButton % 10));
        option.setOnClickListener(this);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.BELOW,
                ((1000 * (questionNo - 1)) + 1));
        params.addRule(RelativeLayout.RIGHT_OF, ((1000 * questionNo)
                + (clickedButton % 10) - 1));
        option.setLayoutParams(params);
        r2.addView(option, params);
        break;
    case 2:
        ImageView checked = new ImageView(this);
        checked.setImageResource(questionImages[1][(clickedButton % 10) - 1]);
        checked.setId((1000 * questionNo) + (clickedButton % 10));
        checked.setOnClickListener(this);
        RelativeLayout.LayoutParams params_checked = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        params_checked.addRule(RelativeLayout.BELOW,
                ((1000 * (questionNo - 1)) + 1));
        params_checked.addRule(RelativeLayout.RIGHT_OF,
                ((1000 * questionNo) + (clickedButton % 10) - 1));
        checked.setLayoutParams(params_checked);
        r2.addView(checked, params_checked);
        break;
    case 3:
        for (i = 10; i > -1; i--) {
            ImageView num = new ImageView(this);
            num.setImageResource(questionImages[2][10 - i]);
            num.setId((1000 * questionNo) + (100 * rowNo) + i + 1);
            num.setOnClickListener(this);
            RelativeLayout.LayoutParams params_num = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            if (rowNo == 0) {
                params_num.addRule(RelativeLayout.RIGHT_OF,
                        (1000 * questionNo));
            } else {
                params_num.addRule(RelativeLayout.RIGHT_OF,
                        (1000 * questionNo) + (100 * (rowNo - 1)) + i + 1);
            }
            if (i == 10) {
                params_num.addRule(RelativeLayout.BELOW,
                        (1000 * (questionNo - 1)) + 1);
            } else {
                params_num.addRule(RelativeLayout.BELOW,
                        ((1000 * questionNo) + (100 * rowNo) + i + 2));
            }
            num.setLayoutParams(params_num);
            r2.addView(num, params_num);
        }
        ImageView num = new ImageView(this);
        num.setImageResource(questionImages[3][11 - (clickedButton % 100)]);
        num.setId((1000 * questionNo) + (100 * rowNo)
                + (clickedButton % 100));
        num.setOnClickListener(this);
        RelativeLayout.LayoutParams params_num = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        if (rowNo == 0) {
            params_num
                    .addRule(RelativeLayout.RIGHT_OF, (1000 * questionNo));
        } else {
            params_num.addRule(RelativeLayout.RIGHT_OF, (1000 * questionNo)
                    + (100 * (rowNo - 1)) + (clickedButton % 100));
        }
        if (((clickedButton % 100) - 1) == 10) {
            params_num.addRule(RelativeLayout.BELOW,
                    (1000 * (questionNo - 1)) + 1);
        } else {
            params_num.addRule(RelativeLayout.BELOW, ((1000 * questionNo)
                    + (100 * rowNo) + (clickedButton % 100) + 1));
        }
        num.setLayoutParams(params_num);
        r2.addView(num, params_num);
        break;
    case 4:
        for (i = 0; i < quizData[questionNo - 1][3]; i++) {
            ImageView match = new ImageView(this);
            match.setImageResource(questionImages[0][i]);
            match.setId((1000 * questionNo) + (100 * rowNo) + i + 1);
            match.setOnClickListener(this);
            RelativeLayout.LayoutParams params_match = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            if (i == 0) {
                params_match.addRule(RelativeLayout.RIGHT_OF,
                        (1000 * questionNo));
            } else {
                params_match.addRule(RelativeLayout.RIGHT_OF,
                        (1000 * questionNo) + (100 * rowNo) + i);
            }
            if (rowNo == quizData[questionNo - 1][2] - 1) {
                params_match.addRule(RelativeLayout.BELOW,
                        (1000 * (questionNo - 1)) + 1);
            } else {
                params_match.addRule(RelativeLayout.BELOW,
                        (1000 * questionNo) + (100 * (rowNo + 1)) + i + 1);
            }
            match.setLayoutParams(params_match);
            r2.addView(match, params_match);
        }
        ImageView match = new ImageView(this);
        match.setImageResource(questionImages[1][(clickedButton % 10) - 1]);
        match.setId((1000 * questionNo) + (100 * rowNo)
                + (clickedButton % 10));
        match.setOnClickListener(this);
        RelativeLayout.LayoutParams params_match = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        if (((clickedButton % 10) - 1) == 0) {
            params_match.addRule(RelativeLayout.RIGHT_OF,
                    (1000 * questionNo));
        } else {
            params_match.addRule(RelativeLayout.RIGHT_OF,
                    (1000 * questionNo) + (100 * rowNo)
                            + (clickedButton % 10) - 1);
        }
        if (rowNo == quizData[questionNo - 1][2] - 1) {
            params_match.addRule(RelativeLayout.BELOW,
                    (1000 * (questionNo - 1)) + 1);
        } else {
            params_match.addRule(RelativeLayout.BELOW,
                    (1000 * (questionNo)) + (100 * (rowNo + 1))
                            + (clickedButton % 10));
        }
        match.setLayoutParams(params_match);
        r2.addView(match, params_match);
        break;
    case 5:
        ImageView match_checked = new ImageView(this);
        match_checked
                .setImageResource(questionImages[1][(clickedButton % 10) - 1]);
        match_checked.setId((1000 * questionNo) + (100 * rowNo)
                + (clickedButton % 10));
        match_checked.setOnClickListener(this);
        RelativeLayout.LayoutParams params_mc = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        if (((clickedButton % 10) - 1) == 0) {
            params_mc.addRule(RelativeLayout.RIGHT_OF, 1000 * questionNo);
        } else {
            params_mc.addRule(RelativeLayout.RIGHT_OF, (1000 * questionNo)
                    + (100 * rowNo) + (clickedButton % 10) - 1);
        }
        if (rowNo == quizData[questionNo - 1][2] - 1) {
            params_mc.addRule(RelativeLayout.BELOW,
                    (1000 * (questionNo - 1)) + 1);
        } else {
            params_mc.addRule(RelativeLayout.BELOW, (1000 * (questionNo))
                    + (100 * (rowNo + 1)) + (clickedButton % 10));
        }
        match_checked.setLayoutParams(params_mc);
        r2.addView(match_checked, params_mc);
        System.out.println(match_checked.getDrawable());
        break;
    }
}
}
4

2 に答える 2

1

現在使用されている画像を追跡する代わりに、データ モデルの観点から問題を考える必要があります。データ モデルは、アプリケーションの状態を保持します。あなたが持っているのは一連の質問であり、各質問にはさまざまな可能な回答があり、選択された回答/回答があるように見えます。データを適切にモデル化すると、モデルの状態に必要なあらゆる種類のビュー ロジックを適用できます。これは、MVC (モデル ビュー コントローラー) パラダイムからそのままです。

あなたのアプリケーションが現在のように拡張できるとは思えないので、ある種のモデルを定義する必要があります。これは、いくつかのクラス (Question クラス、Answer クラス) で簡単に実行でき、いくつかの異なる方法で関係を定義できます。そこから、モデルの現在の状態に基づいて View を書き出すだけです。Android では、これはAdaptersAdapterViewで行われます。通常、これらを直接使用することはありません。あなたの場合は、おそらくListAdapterでListViewを使用するでしょう。ユーザーが何かをクリックすると、そのイベントがキャプチャされ、モデルが更新されます。ListAdapter は、 DataSetObserverを介してモデルへの変更をリッスンします、ただし、クリックをリッスンして、オブザーバーを完全に使用する代わりに、onclick リスナーで直接変更を加えることができます。

これは明らかに、これらすべてに精通していない限り、1、2 時間でできることではありませんが、IMO を使用すると、アプリケーションがよりクリーンになり、デバッグが容易になり、テストが容易になり、堅牢になります。

于 2012-06-18T06:01:47.213 に答える
0

以下は、「bt.xml」という名前の CheckBox のセレクターで、このファイルをドローアブル フォルダーに配置します。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" android:drawable="@drawable/chceked_image"/>
    <item android:drawable="@drawable/unchceked_image"/>

</selector>

レイアウトフォルダーで「row.xml」という名前のように、ImageViewの代わりにCheckBoxを使用します

<CheckBox 
        android:layout_height="30dp"
        android:layout_width="30dp"
        android:button="@drawable/bt"
        android:focusable="false"
        android:id="@+id/ch"/>

ボタン属性は、チェックボックスの画像を独自の画像に変更します

チェックされた状態とチェックされていない状態の 2 つの状態を持つ ChcekBox を使用すると、回答の状態を簡単に取得できます。

次に、レイアウト インフレータを使用して xml をインフレートします。たとえば、質問に対して 3 つの回答があるとします。

 ChcekBox ch[] = new CheckBox[3];

 layout = findViewById(R.id.main_layout);
 LayoutInflater layoutInflater = LayoutInflater.from(this);

 for(int i = 0; i<3; i++)
 {
   View rowView = layoutInflater.inflate(R.layout.row, layout);
   ch[i] = (CheckBox)rowView.findViewById(R.id.ch);
   ch[i].setId(assign_new_id);
 }
于 2012-06-18T07:33:39.323 に答える