我正在开发一个驾驶学校测试应用程序,我需要一些帮助。
我有这样的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问题答案答案B答案C答案图像
我使用数据库填充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());
我如何填充radiobuttons?查询将是“SELECT AnswerA,AnswerB,AnswerC from table WHERE id_test = 1”
我的最后一个问题是如何纠正测试。我想在数组中存储radiobutton(我不知道具体如何),然后与正确的答案进行比较。查询将是“表WHERE id_test = 1中的SELECT AnswerOK”。
示例:
一系列已回答的问题: 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++;
谢谢:)
答案 0 :(得分:3)
我如何填充radiobuttons?查询将是“SELECT AnswerA, AnswerB,来自表WHERE id_test = 1“
的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
循环中,将文本分配给RadioButton
,就像您为TextView txtenun
所做的那样。
我的最后一个问题是如何纠正测试。我想存储 radiobutton在数组中按下(我不确切知道如何)然后 与正确的答案进行比较。
为您的所有OnCheckedChangeListener()
添加RadioGroup
。在该监听器中,您将获得用户检查某些内容的RadioGroup
以及已检查RadioButton
的ID。用它来构造正确答案的数组。
一些建议:
也许您应该修改布局和当前的方法。让用户滚动你的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
(可能是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
}
}
});
答案 1 :(得分: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());