설문조사 기능구현

노지수·2022년 2월 5일
0

activity_main.xml

레이아웃 잡기

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="설문조사"
            android:textSize="28sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_bias="0.085"
            app:layout_constraintVertical_bias="0.042"/>

    <!-- 유저이름 -->
    <TextView
            android:id="@+id/userName"
            android:text="이름"
            android:textSize="24sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.075"
            app:layout_constraintVertical_bias="0.122"/>
    <EditText
            android:layout_width="209dp"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text=""
            android:textSize="20sp"
            android:ems="10"
            android:id="@+id/editTextTextPersonName"
            tools:ignore="MissingConstraints" 
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent" 
            app:layout_constraintStart_toEndOf="@+id/userName"
            app:layout_constraintBottom_toBottomOf="parent" 
            app:layout_constraintHorizontal_bias="0.055"
            app:layout_constraintVertical_bias="0.116"/>

    <!-- 질문1 -->
    <TextView
            android:id="@+id/quest1"
            android:text="질문1) 영어로 대화할 수 있습니까?"
            android:textSize="22sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:ignore="MissingConstraints"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.146"
            app:layout_constraintVertical_bias="0.217"/>
    <RadioGroup
            android:id="@+id/radioGroup"
            android:layout_width="379dp"
            android:layout_height="47dp"
            android:orientation="horizontal"
            tools:ignore="MissingConstraints"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.19"
            app:layout_constraintVertical_bias="0.254">
        <RadioButton
                android:layout_weight="1"
                android:text="예"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/q1Btn1"/>
        <RadioButton
                android:layout_weight="1"
                android:text="아니오"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/q1Btn2"/>
        <RadioButton
                android:layout_weight="1"
                android:text="모르겠습니다"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/q1Btn3"/>
    </RadioGroup>

    <!-- 질문2 -->
    <TextView
            android:id="@+id/quest2"
            android:text="질문2) 영어 외에 관심 있는 언어는 무엇입니까?"
            android:textSize="22sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:ignore="MissingConstraints" 
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent" 
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" 
            app:layout_constraintHorizontal_bias="0.238"
            app:layout_constraintVertical_bias="0.358"/>
    <CheckBox
            android:text="독일어"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/checkBox1"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.083"
            app:layout_constraintVertical_bias="0.398"/>
    <CheckBox
            android:text="프랑스어"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/checkBox2"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.314"
            app:layout_constraintVertical_bias="0.398"/>
    <CheckBox
            android:text="일본어"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/checkBox3"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintVertical_bias="0.398"
            app:layout_constraintHorizontal_bias="0.543"/>

    <!-- 질문3 -->
    <TextView
            android:id="@+id/quest3"
            android:text="질문3) 당신의 의견을 작성해 주십시오"
            android:textSize="22sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:ignore="MissingConstraints" 
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" 
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent" 
            app:layout_constraintHorizontal_bias="0.162"/>
    <EditText
            android:layout_width="477dp"
            android:layout_height="197dp"
            android:inputType="textPersonName"
            android:text=""
            android:textSize="20sp"
            android:ems="10"
            android:gravity="top"
            android:id="@+id/userComment"
            app:layout_constraintStart_toStartOf="parent" 
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" 
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.341" 
            app:layout_constraintVertical_bias="0.668"/>

    <!-- 질문4 -->
    <TextView
            android:id="@+id/quest4"
            android:text="당신의 연령대를 선택해 주십시오"
            android:textSize="22sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:ignore="MissingConstraints" 
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" 
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_bias="0.138" 
            app:layout_constraintVertical_bias="0.817"/>
    <Spinner
            android:layout_width="wrap_content"
            android:layout_height="35dp"
            android:id="@+id/spinner"
            android:textSize="20sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.867"
            app:layout_constraintHorizontal_bias="0.076"/>
    <Button
            android:text="결과"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/result"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_bias="0.948"
            app:layout_constraintVertical_bias="0.971"/>

</androidx.constraintlayout.widget.ConstraintLayout>

xml파일 만들기

1. item_spinner.xml

app - src - main - res - menu에 Menu리소스파일 만들기

2. array.xml

app - src - main - res - values에 values XML File만들기

spinner

연령대를 선택할 수 있게 항목 만들기


// item_spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/tvItemSpinner"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:paddingTop="10dp"
        android:paddingStart="30dp"
        android:textColor="@android:color/black"
        android:textSize="15sp"
        android:paddingLeft="30dp"/>

// array.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="ages">
        <item>10</item>
        <item>20</item>
        <item>30</item>
        <item>40</item>
        <item>50</item>
        <item>60대 이상</item>
    </string-array>
</resources>

bulid.gradle(:app)

buildFeatures{
    viewBinding true
}

MainActivity

객체화

val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
...
 setContentView(binding.root)

이름입력

var username = binding.userName.text // username이라는 변수에 입력받은 문자 저장

질문1) radio버튼

var q1Result = ""
binding.radioGroup.setOnCheckedChangeListener{ _, checkedId->
	// 체크된 값의 따라서 변수의 다른값을 저장
    when(checkedId){
        R.id.q1Btn1 -> {
            q1Result = "영어로 대화 가능"
        }
        R.id.q1Btn2 -> {
            q1Result = "영어로 대화 불가능"
        }
        R.id.q1Btn3 -> {
            q1Result = "영어로 대화가능여부 모름"
        }
    }
}

질문2) checkBox

// 체크됐을때와 안됐을때 각각 변수의 값 저장

// 독일어
var box1 = ""
binding.checkBox1.setOnCheckedChangeListener { _, isChecked ->
	if(isChecked){
		box1 = "독일어 가능"
    }else{
        box1 = "독일어 불가능"
    }
}

// 프랑스어
var box2 = ""
binding.checkBox2.setOnCheckedChangeListener { _, isChecked ->
    if(isChecked){
        box2 = "프랑스어 가능"
    }else{
        box2 = "프랑스어 불가능"
    }
}

// 일본어
var box3 = ""
binding.checkBox3.setOnCheckedChangeListener { _, isChecked ->
	if(isChecked){
		box3 = "일본어 가능"
    }else{
        box3 = "일본어 불가능"
    }
}

질문3) 유저의견

// userComment라는 변수의 입력받은 의견을 저장
var userComment = binding.userComment.text

질문4) 연령대 선택

// onCreate함수 안에서 함수 호출
setupSpinnerFruit()     // 값을 설정하는 함수를 호출

setupSpinnerHandler()   // 선택한 값을 출력하는 함수를 호출

// onCreate함수 밖에서 함수 작성
fun setupSpinnerFruit(){	// 값을 설정하는 함수
	val ages = resources.getStringArray(R.array.ages)
    // 어탭터에 배열과 xml을 적용
    val adapter = ArrayAdapter(this, R.layout.item_spinner, ages)

    // spinner에 적용
    binding.spinner.adapter = adapter
}

fun setupSpinnerHandler(){	// 선택한 값을 출력
	binding.spinner.onItemSelectedListener = object:AdapterView.OnItemSelectedListener{
		override fun onItemSelected(p0:AdapterView<*>?, view:View?, position:Int, id:Long) {
           age = "${binding.spinner.getItemAtPosition(position)}"
        }
        override fun onNothingSelected(p0: AdapterView<*>?) {
        }
    }
}

결과버튼 클릭 시 입력한 값출력

binding.result.setOnClickListener {
        AlertDialog.Builder(this@MainActivity).setTitle("설문조사 결과") // 제목
        .setMessage(	 // 메세지
        "${q1Result} \n${box1} \n${box2} \n${box3} \n${userComment} \n연령 : ${age}"
        )
        .setCancelable(false) // 화면밖터치시(ture=꺼짐 / false=안꺼짐)
        .setNeutralButton("확인", DialogInterface.OnClickListener{ dialog, whitch->
        }).show()
}

결과

실행 시 기본화면


설문작성


결과버튼 클릭시 나타나는 화면

문제점 (22.02.05)

코드작성 및 테스트중 라디오버튼 및 체크박스를 아예 터치하지 않았을 경우 최초로 설정된 빈값이 출력되는 문제 발견 오류해결방법을 찾는대로 해결하고 게시글 수정 예정

개선방법1 (22.02.06)

라디오버튼

var q1Result = "미응답"

처음 빈값이 아닌 미응답이라는 단어를 넣어둔다.
설문을 넘어갔을때, 결과창에서는 미응답이라고 출력이 된다.

체크박스

var box4 = ""
binding.checkBox4.setOnCheckedChangeListener { _, ischecked ->
	if(ischecked){
		box4 = "없음"
	}else{
		box4 = ""
	}
}

관심있는 언어 선택란에서 없음버튼을 추가함.

setMessage("관심언어 : ${box1}${box2}${box3}${box4}") // 관심언어 부분만 적음

줄바꿈을 없애고 각 문항이 체크됐을때 해당하는 값이 출력되게 만듦.
(언어 + 없음의 중복체크 문제 및 정렬방식때문에 더 나은 해결방법을 찾아야함)

profile
프로그래밍, 개념 및 이론 기록

0개의 댓글