Android:设计一个简单的调查问卷

设计一个简单的调查问卷,要求用到TextView,Button,CheckBox,RadioButton,EditText等控件

今天写了一个demo,里面用到了常用的布局,以及常用的几种控件,这里调查问卷名字为大学生日常消费调查问卷,是参考网上的常用调查问卷,选择了几个问题,为了省事,这里我只选择了6个问题,最终效果:用户填写完调查问卷,点击提交,页面跳转到另一个结果页面,显示用户提交的数据结果,当点击提交时如果有未填项,则不能跳转。主要为了练习常用布局以及控件的使用。

最终效果图

Android:设计一个简单的调查问卷Android:设计一个简单的调查问卷

设计要点:

  1. 使用ScrollView 来实现屏幕的滚动效果;
  2. RadioGroupRadioButton的配合使用;
  3. RadioGroupCheckBox事件监听的实现;
  4. 显示页面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);
    }
}

问卷显示结果页面效果图

Android:设计一个简单的调查问卷

其中遇到的问题

ArrayList忘记初始化,总是获取不到复选框的值,每次程序运行,一点击复选框,程序自动崩溃,且出错时系统没有错误提示信息,坑!