3

我正在开发一个驾校考试应用程序,我需要一些帮助。

我有这样的xml文件:

<!-- language: lang-xml -->
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget28"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#AAC1E2" >

    <LinearLayout
        android:id="@+id/widget29"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/i1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />

        <TextView
            android:id="@+id/e1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Enun"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <RadioGroup
            android:id="@+id/radioGroup1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
        </RadioGroup>

         <ImageView
            android:id="@+id/i2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />

        <TextView
            android:id="@+id/e2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Enun"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <RadioGroup
            android:id="@+id/radioGroup2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
        </RadioGroup>

... x 30 次和一个按钮,可以纠正测试并显示您是否通过了。当您未通过 3 个问题或更少时,您通过了测试。

问题以这种方式存储:

Id_question Id_topic Id_test 问题 AnswerA AnswerB AnswerC AnswerOK 图片

  • Id_question Id_topic 和 id_test 是整数字段
  • Question 和 AnswerA-C 是文本字段
  • AnswerOK 是一个整数字段。如果 AnswerA 是 OK = 1, AnswerB = 2, AnswerC = 3
  • 图像是相关图像的名称,从资源文件夹中提取。

我使用数据库来填充 xml 中的每个字段。图像和问题以这种方式从数据库中提取:

<!-- language: lang-java -->
    Cursor c = adbh.query(bundle.getString("test")); 
    //"test"-->"SELECT question, image FROM table WHERE id_test = 1"

        Integer i = 1;

        if (c.moveToFirst()) {
            do {
                String path = c.getString(index);
                String nimage = "i"+i;
                int idImage = getResources().getIdentifier(nimage, "id", this.getPackageName());
                ImageView image = (ImageView) findViewById(idImage);
                int idDrawable = getResources().getIdentifier(ruta, "drawable", this.getPackageName());
                image.setImageResource(idDrawable);

                String nenun = "e"+i;
                String enun = c.getString(anotherIndex);
                int idEnun = getResources().getIdentifier(nenun, "id", this.getPackageName());
                TextView txtenun = (TextView) findViewById(idEnun);
                txtenun.setText(enun);

                i++;
            } while (c.moveToNext());

如何填充单选按钮?查询将是“从表 WHERE id_test = 1 中选择 AnswerA、AnswerB、AnswerC”

我的最后一个问题是如何纠正测试。我认为将按下的单选按钮(我不知道如何)存储在数组中,然后与正确答案进行比较。查询将是“SELECT AnswerOK from table WHERE id_test = 1”。

例子:

已回答问题数组:1 1 1 2 2 3 2 3 1 3 2... 正确答案数组:3 2 1 2 2 3 2 3 2 2 2...

<!-- language: lang-java -->
    for (int i=0; i<30; i++)
    if (a[i] == b[i])
    numberOfRightAnswers++;

谢谢 :)

4

2 回答 2

3

如何填充单选按钮?查询将是“从表 WHERE id_test = 1 中选择 AnswerA、AnswerB、AnswerC”

可能希望在第一个查询中直接选择这些值,所以而不是:

Cursor c = adbh.query(bundle.getString("test")); 
    //"test"-->"SELECT question, image FROM table WHERE id_test = 1"

将有:

Cursor c = adbh.query(bundle.getString("test")); 
    //"test"-->"SELECT question, AnswerA,  AnswerB, AnswerC, image FROM table WHERE id_test = 1"

然后在那个while循环中将文本分配给RadioButtons 就像你做的那样TextView txtenun

我的最后一个问题是如何纠正测试。我认为将按下的单选按钮(我不知道如何)存储在数组中,然后与正确答案进行比较。

将 a 添加OnCheckedChangeListener()到您的所有RadioGroups。在该侦听器中,您将获得RadioGroup用户检查某些内容的位置和被检查的 id RadioButton。使用它来构建正确答案的数组。

一些建议:

也许你应该修改你的布局和你当前的方法。让用户滚动您的 30 个问题布局可能不是一个好主意,而且您正在加载许多资源,尽管用户在遇到特定问题之前不会真正看到它们(我不知道您的图像的大小,如果它们很小,这可能不是问题)。您的其他选择是一个ListView问题的布局或简单布局,您可以根据用户所在的问题按需填充。我的建议是第二种选择。该选项还将帮助您避免getIdentifier方法调用,此方法比该方法慢findViewById,应该避免。波纹管是一个布局:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#AAC1E2" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/questionImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/questionText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Enun"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <RadioGroup
            android:id="@+id/radioGroup1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
        </RadioGroup>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:weightSum="3" >

            <Button
                android:id="@+id/previousQuestion"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="previous" />

            <Button
                android:id="@+id/validateTest"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="validate" />

            <Button
                android:id="@+id/nextQuestion"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="next" />
        </LinearLayout>
    </LinearLayout>

</ScrollView>

您将对该测试中的所有问题(包括所有数据)进行查询,并从静态字段开始int counter = 0。当应用程序启动时,您会将光标移动到计数器值(开始时为 0):

c.moveToPosition(counter);

并使用该行中的值来填充上述问题布局:

ImageView questionImage = (ImageView) findViewById(R.id.questionImage);
int idDrawable = getResources().getIdentifier(ruta, "drawable", this.getPackageName());
   questionImage.setImageResource(idDrawable);

String enun = c.getString(anotherIndex);
TextView txtenun = (TextView) findViewById(R.id.questionText);
txtenun.setText(enun);
// will do the same to populate the other parts of the question from the cursor

当用户按下时,nextQuestion Button您将增加counter值(您应该进行一些检查,以免超过 30 个问题),counter再次将光标移动到该位置,然后像上面一样填充布局。当用户按下您递减的 previousQuestion 时counter,移动光标并再次用数据填充布局。此外,您只需将一个添加OnCheckedChangeListener到您的RadioGroup. 当该侦听器触发时,您应该存储问题 id(从counter您应该能够判断您是哪个问题的值)和RadioButton数据结构中选择的(可能是 a HashMap),从数据库中检索测试的正确答案并查看如果用户它是一个很好的驱动程序。

您也可以(可能)优化您的数据库。

编辑:

private ArrayList<Integer> responses = new ArrayList<Integer>(); // this will hold the number of the correct answer. Note that this will work if the user answers question one after the other
// if the user skips question you'll get in trouble, this is one of the reasons why your design is not so good.

String rg = "radioGroup" + i;
int idRg = getResources().getIdentifier(rg, "id", this.getPackageName());
RadioGroup radioGroup = (TextView) findViewById(idRg);
radioGroup.setOnChekedChangeListener(new OnCheckedChangeListener(){
       public void onCheckedChanged (RadioGroup group, int checkedId) {
            if (group.getChildAt(0).getId() == checkedId) {
               responses.add(0); // the first answer was checked
            } else if (group.getChildAt(1).getId() == checkedId) {
               responses.add(1); // the first answer was checked
            } else if (group.getChildAt(2).getId() == checkedId) {
               responses.add(2); // the first answer was checked
            }
      } 
});
于 2012-04-09T08:27:07.887 回答
0

根据@Luksprog 的回答,这是我最终的工作循环:

Cursor c = adbh.query(bundle.getString("test"));

    Integer i = 1;

    if (c.moveToFirst()) {
        do {
            String ruta = c.getString(4);
            String nimage = "i" + i;
            int idImage = getResources().getIdentifier(nimage, "id",
                    this.getPackageName());
            ImageView image = (ImageView) findViewById(idImage);
            int idDrawable = getResources().getIdentifier(ruta, "drawable",
                    this.getPackageName());
            image.setImageResource(idDrawable);

            String rgname = "radioGroup"+i;
            int idRg = getResources().getIdentifier(rgname, "id",
                    this.getPackageName());
            RadioGroup rg = (RadioGroup) findViewById(idRg);
            rg.removeAllViews();
            RadioButton rb1 = new RadioButton(this);
            rb1.setId(i);
            rb1.setText(c.getString(1));
            rg.addView(rb1);
            RadioButton rb2 = new RadioButton(this);
            rb2.setId(i+1);
            rb2.setText(c.getString(2));
            rg.addView(rb2);
            RadioButton rb3 = new RadioButton(this);
            rb3.setId(i+2);
            rb3.setText(c.getString(3));
            rg.addView(rb3);


            String nenun = "e" + i;
            String enun = c.getString(0);
            int idEnun = getResources().getIdentifier(nenun, "id",
                    this.getPackageName());
            TextView txtenun = (TextView) findViewById(idEnun);
            txtenun.setText(enun);

            i++;
        } while (c.moveToNext());
于 2012-04-09T16:59:49.407 回答