Android:设计一个简单的调查问卷
设计一个简单的调查问卷,要求用到TextView,Button,CheckBox,RadioButton,EditText等控件
今天写了一个demo,里面用到了常用的布局,以及常用的几种控件,这里调查问卷名字为大学生日常消费调查问卷,是参考网上的常用调查问卷,选择了几个问题,为了省事,这里我只选择了6个问题,最终效果:用户填写完调查问卷,点击提交,页面跳转到另一个结果页面,显示用户提交的数据结果,当点击提交时如果有未填项,则不能跳转。主要为了练习常用布局以及控件的使用。
最终效果图
设计要点:
- 使用ScrollView 来实现屏幕的滚动效果;
- RadioGroup与RadioButton的配合使用;
- RadioGroup与CheckBox事件监听的实现;
- 显示页面QuestionnaireActivity与结果页面QuestionnaireResultActivity之间数据的传递;
其中问卷显示页面代码如下
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE"
tools:context="com.fang.zzti.layout.Questionnaire">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:background="#0099FF"
android:text="大学生日常消费调查问卷"
android:textSize="25dp"
android:textColor="@color/white"
/>
<!--性别-->
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="1.您的性别是:"
android:textSize="25dp"
android:layout_marginTop="30dp"
android:layout_marginLeft="10dp"
/>
<RadioGroup
android:id="@+id/rg_gender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:background="@color/white"
>
<RadioButton
android:id="@+id/rb_man"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
android:textSize="25dp"
/>
<RadioButton
android:id="@+id/rb_woman"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="女"
android:textSize="25dp"
/>
</RadioGroup>
<!--2.院系-->
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="2.您的院系是:"
android:textSize="25dp"
android:layout_marginTop="30dp"
android:layout_marginLeft="10dp"
/>
<RadioGroup
android:id="@+id/rg_department"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/white"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<RadioButton
android:id="@+id/rb_department1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="软件学院"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_department2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="计算机学院"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_department3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="外语学院"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_department4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="其他学院"
android:textSize="25dp"
android:paddingTop="5dp"
/>
</RadioGroup>
<!--3.年级-->
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="3.您的年级是:"
android:textSize="25dp"
android:layout_marginTop="30dp"
android:layout_marginLeft="10dp"
/>
<RadioGroup
android:id="@+id/rg_grade"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/white"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<RadioButton
android:id="@+id/rb_grade1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="大一"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_grade2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="大二"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_grade3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="大三"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_grade4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="大四"
android:textSize="25dp"
android:paddingTop="5dp"
/>
</RadioGroup>
<!--4.每月消费-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="4.您的在校期间平均月消费为:"
android:textSize="25dp"
android:layout_marginTop="30dp"
android:layout_marginLeft="10dp"
/>
<RadioGroup
android:id="@+id/rg_consume"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/white"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<RadioButton
android:id="@+id/rb_consume1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="600以下"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_consume2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="600-1000"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_consume3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1000-1500"
android:textSize="25dp"
android:paddingTop="5dp"
/>
<RadioButton
android:id="@+id/rb_consume4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1500元以上"
android:textSize="25dp"
android:paddingTop="5dp"
/>
</RadioGroup>
<!--5.主要消费用途-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="5.您每月消费主要在哪些方面:"
android:textSize="25dp"
android:layout_marginTop="30dp"
android:layout_marginLeft="10dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/white"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<CheckBox
android:id="@+id/cb_mainconsume_a"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="A.伙食"/>
<CheckBox
android:id="@+id/cb_mainconsume_b"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="B.购物(服装、饰品)"/>
<CheckBox
android:id="@+id/cb_mainconsume_c"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="C.学习费用(书籍)"/>
<CheckBox
android:id="@+id/cb_mainconsume_d"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="D.娱乐"/>
<CheckBox
android:id="@+id/cb_mainconsume_e"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="E.上网消费"/>
<CheckBox
android:id="@+id/cb_mainconsume_f"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="F.恋爱"/>
<CheckBox
android:id="@+id/cb_mainconsume_g"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="G.其他"/>
</LinearLayout>
<!--6.建议-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="6.请对大学生消费情况提出您宝贵的建议:"
android:textSize="25dp"
android:layout_marginTop="30dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"/>
<EditText
android:id="@+id/et_suggest"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@color/white"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:inputType="text"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
>
<Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:textColor="@color/white"
android:background="@color/submit"/>
<Button
android:id="@+id/btn_exit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/btn_submit"
android:layout_marginLeft="10dp"
android:textColor="@color/white"
android:background="@color/submit"
android:text="退出"/>
</RelativeLayout>
</LinearLayout>
</ScrollView>
设置监听器
其中单选按钮RadioButton一般是由RadioGroup响应,所以这里实现RadioGroup.OnCheckedChangeListener,而复选框CheckBox监听要实现CompoundButton.OnCheckedChangeListener,另外Button点击事件的监听要实现View.OnClickListener,代码如下:
public class Questionnaire extends AppCompatActivity
implements RadioGroup.OnCheckedChangeListener,
CompoundButton.OnCheckedChangeListener,
View.OnClickListener{
显示页面核心代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_questionnaire);
initView();
}
public void initView(){
// 性别
rg_gender=(RadioGroup)findViewById(R.id.rg_gender);
rb_gender1=(RadioButton)findViewById(R.id.rb_man);
rb_gender2=(RadioButton)findViewById(R.id.rb_woman);
// 学院
rg_department=(RadioGroup)findViewById(R.id.rg_department);
rb_department1=(RadioButton)findViewById(R.id.rb_department1);
rb_department2=(RadioButton)findViewById(R.id.rb_department2);
rb_department3=(RadioButton)findViewById(R.id.rb_department3);
rb_department4=(RadioButton)findViewById(R.id.rb_department4);
//消费
rg_consume=(RadioGroup)findViewById(R.id.rg_consume);
rb_consume1=(RadioButton)findViewById(R.id.rb_consume1);
rb_consume2=(RadioButton)findViewById(R.id.rb_consume2);
rb_consume3=(RadioButton)findViewById(R.id.rb_consume3);
rb_consume4=(RadioButton)findViewById(R.id.rb_consume4);
//年级
rg_grade=(RadioGroup)findViewById(R.id.rg_grade);
rb_grade1=(RadioButton)findViewById(R.id.rb_grade1);
rb_grade2=(RadioButton)findViewById(R.id.rb_grade2);
rb_grade3=(RadioButton)findViewById(R.id.rb_grade3);
rb_grade4=(RadioButton)findViewById(R.id.rb_grade4);
// 主要消费
cb_meal=(CheckBox)findViewById(R.id.cb_mainconsume_a);
cb_shopping=(CheckBox)findViewById(R.id.cb_mainconsume_b);
cb_study=(CheckBox)findViewById(R.id.cb_mainconsume_c);
cb_amusement=(CheckBox)findViewById(R.id.cb_mainconsume_d);
cb_internet=(CheckBox)findViewById(R.id.cb_mainconsume_e);
cb_loveconsume=(CheckBox)findViewById(R.id.cb_mainconsume_f);
cb_otherconsume=(CheckBox)findViewById(R.id.cb_mainconsume_g);
// 建议
et_suggest=(EditText)findViewById(R.id.et_suggest);
bt_submit=(Button)findViewById(R.id.btn_submit);
bt_exit=findViewById(R.id.btn_exit);
bt_submit.setOnClickListener(this);
bt_exit.setOnClickListener(this);
rg_gender.setOnCheckedChangeListener(this);
rg_department.setOnCheckedChangeListener(this);
rg_consume.setOnCheckedChangeListener(this);
rg_grade.setOnCheckedChangeListener(this);
cb_shopping.setOnCheckedChangeListener(this);
cb_meal.setOnCheckedChangeListener(this);
cb_otherconsume.setOnCheckedChangeListener(this);
cb_study.setOnCheckedChangeListener(this);
cb_amusement.setOnCheckedChangeListener(this);
cb_loveconsume.setOnCheckedChangeListener(this);
cb_internet.setOnCheckedChangeListener(this);
mainConsume=new ArrayList<String>();
}
@Override
public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
switch (checkedId){
case R.id.rb_man:
gender=rb_gender1.getText().toString();
//Toast.makeText(this,"你选择了"+rb_gender1.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_woman:
gender=rb_gender2.getText().toString();
// Toast.makeText(this,"你选择了"+rb_gender2.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_department1:
department=rb_department1.getText().toString();
// Toast.makeText(this,"你选择了"+rb_department1.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_department2:
department=rb_department2.getText().toString();
//Toast.makeText(this,"你选择了"+rb_department2.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_department3:
department=rb_department3.getText().toString();
//Toast.makeText(this,"你选择了"+rb_department3.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_department4:
department=rb_department4.getText().toString();
//Toast.makeText(this,"你选择了"+rb_department4.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_consume1:
consume=rb_consume1.getText().toString();
//Toast.makeText(this,"你选择了"+rb_consume1.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_consume2:
consume=rb_consume2.getText().toString();
//Toast.makeText(this,"你选择了"+rb_consume2.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_consume3:
consume=rb_consume3.getText().toString();
//Toast.makeText(this,"你选择了"+rb_consume3.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_consume4:
consume=rb_consume4.getText().toString();
// Toast.makeText(this,"你选择了"+rb_consume4.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_grade1:
grade=rb_grade1.getText().toString();
// Toast.makeText(this,"你选择了"+rb_grade1.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_grade2:
grade=rb_grade2.getText().toString();
//Toast.makeText(this,"你选择了"+rb_grade2.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_grade3:
grade=rb_grade3.getText().toString();
// Toast.makeText(this,"你选择了"+rb_grade3.getText().toString(),Toast.LENGTH_LONG).show();
break;
case R.id.rb_grade4:
grade=rb_grade4.getText().toString();
//Toast.makeText(this,"你选择了"+rb_grade4.getText().toString(),Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void onCheckedChanged(CompoundButton checkbox, boolean isChecked) {
// checkbox.setChecked(!isChecked);
int checkboxId=checkbox.getId();
//Toast.makeText(this,"checkboxId:"+checkboxId,Toast.LENGTH_LONG).show();
switch (checkboxId){
case R.id.cb_mainconsume_a:
mainConsume.add(cb_meal.getText().toString());
// Toast.makeText(this,"你选择了"+cb_meal.getText().toString()+"check:"+isChecked,Toast.LENGTH_LONG).show();
break;
case R.id.cb_mainconsume_b:
mainConsume.add(cb_shopping.getText().toString());
// Toast.makeText(this,"你选择了"+cb_shopping.getText().toString()+"check:"+isChecked,Toast.LENGTH_LONG).show();
break;
case R.id.cb_mainconsume_c:
mainConsume.add(cb_study.getText().toString());
// Toast.makeText(this,"你选择了"+cb_shopping.getText().toString()+"check:"+isChecked,Toast.LENGTH_LONG).show();
break;
case R.id.cb_mainconsume_d:
mainConsume.add(cb_amusement.getText().toString());
// Toast.makeText(this,"你选择了"+cb_shopping.getText().toString()+"check:"+isChecked,Toast.LENGTH_LONG).show();
break;
case R.id.cb_mainconsume_e:
mainConsume.add(cb_internet.getText().toString());
//Toast.makeText(this,"你选择了"+cb_shopping.getText().toString()+"check:"+isChecked,Toast.LENGTH_LONG).show();
break;
case R.id.cb_mainconsume_f:
mainConsume.add(cb_loveconsume.getText().toString());
// Toast.makeText(this,"你选择了"+cb_shopping.getText().toString()+"check:"+isChecked,Toast.LENGTH_LONG).show();
break;
case R.id.cb_mainconsume_g:
mainConsume.add(cb_otherconsume.getText().toString());
// Toast.makeText(this,"你选择了"+cb_shopping.getText().toString()+"check:"+isChecked,Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void onClick(View view) {
if(view.getId()==R.id.btn_submit){
suggestion= String.valueOf(et_suggest.getText().toString().trim());
if(gender==null||department==null||grade==null||consume==null||mainConsume.size()==0){
Toast.makeText(this, "您有未填写的项目!", Toast.LENGTH_SHORT).show();
}else{
if(TextUtils.isEmpty(et_suggest.getText())){
Toast.makeText(this, "请填写您的建议", Toast.LENGTH_SHORT).show();
}else{
//进行页面的跳转和数据的传递
Intent intent=new Intent(this,QuestionnaireResult.class);
Bundle bundle=new Bundle();
bundle.putString("gender",gender);
bundle.putString("department",department);
bundle.putString("grade",grade);
bundle.putString("consume",consume);
bundle.putStringArrayList("mainConsume", (ArrayList<String>) mainConsume);
bundle.putString("suggestion",suggestion);
intent.putExtras(bundle);
startActivity(intent);
}
}
}else if(view.getId()==R.id.btn_exit){
this.finish();
}
}
QuestionnaireResult结果页面xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.fang.zzti.layout.QuestionnaireResult">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="您的问卷结果如下:"
android:textSize="30dp"
android:gravity="center"
/>
<TextView
android:id="@+id/tv_gender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"/>
<TextView
android:id="@+id/tv_department"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"/>
<TextView
android:id="@+id/tv_grade"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"/>
<TextView
android:id="@+id/tv_consume"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"/>
<TextView
android:id="@+id/tv_mainConsume"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"/>
<TextView
android:id="@+id/tv_suggestion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"/>
</LinearLayout>
</LinearLayout>
结果页面
public class QuestionnaireResult extends AppCompatActivity {
private TextView tv_gender;
private TextView tv_department;
private TextView tv_grade;
private TextView tv_consume;
private TextView tv_mainConsume;
private TextView tv_suggestion;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_questionnaire_result);
initView();
}
private void initView() {
tv_gender=(TextView)findViewById(R.id.tv_gender);
tv_department=(TextView)findViewById(R.id.tv_department);
tv_grade=(TextView)findViewById(R.id.tv_grade);
tv_consume=findViewById(R.id.tv_consume);
tv_mainConsume=findViewById(R.id.tv_mainConsume);
tv_suggestion=findViewById(R.id.tv_suggestion);
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String gender=bundle.getString("gender","");
String department=bundle.getString("department","");
String grade=bundle.getString("grade","");
String consume=bundle.getString("consume","");
ArrayList<String> mainConsume=bundle.getStringArrayList("mainConsume");
String suggestion=bundle.getString("suggestion");
String mainConsumeStr="";
tv_gender.setText("性别:"+gender);
tv_department.setText("学院:"+department);
tv_grade.setText("年级:"+grade);
tv_consume.setText("月消费情况:"+consume);
for(int i=0;i<mainConsume.size();i++){
mainConsumeStr+="\t\t"+mainConsume.get(i)+"\n";
}
tv_mainConsume.setText("您的主要消费项目为:\n"+mainConsumeStr);
tv_suggestion.setText("您的建议为:\n"+suggestion);
}
}
问卷显示结果页面效果图
其中遇到的问题
ArrayList忘记初始化,总是获取不到复选框的值,每次程序运行,一点击复选框,程序自动崩溃,且出错时系统没有错误提示信息,坑!