MBTI 테스트_ QuestionFragment.kt
package com.android.mymbti_test
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.CheckBox
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.TextView
import android.widget.Toast
class QuestionFragment : Fragment() {
2 private var questionType: Int = 0
//글자를 교체하는 것. 실제로 사용하는 프레그먼트는 1개.
//질문 string을 하나의 list에서 넣어야함.
private val questionTitles = listOf(
R.string.question1_title,
R.string.question2_title,
R.string.question3_title,
R.string.question4_title
)
private val questionTexts = listOf(
//list안에 list로 들어가야함.
//title안에 질문이 3개.
listOf(R.string.question1_1, R.string.question1_2, R.string.question1_3),
listOf(R.string.question2_1, R.string.question2_2, R.string.question2_3),
listOf(R.string.question3_1, R.string.question3_2, R.string.question3_3),
listOf(R.string.question4_1, R.string.question4_2, R.string.question4_3),
)
private val questionAnswers = listOf(
listOf(
//list(title) 안의 list(question) 안의 list(answer)
listOf(R.string.question1_1_answer1, R.string.question1_1_answer2),
listOf(R.string.question1_2_answer1, R.string.question1_2_answer2),
listOf(R.string.question1_3_answer1, R.string.question1_3_answer2)
),
listOf(
listOf(R.string.question2_1_answer1, R.string.question2_1_answer2),
listOf(R.string.question2_2_answer1, R.string.question2_2_answer2),
listOf(R.string.question2_3_answer1, R.string.question2_3_answer2)
),
listOf(
listOf(R.string.question3_1_answer1, R.string.question3_1_answer2),
listOf(R.string.question3_2_answer1, R.string.question3_2_answer2),
listOf(R.string.question3_3_answer1, R.string.question3_3_answer2)
),
listOf(
listOf(R.string.question4_1_answer1, R.string.question4_1_answer2),
listOf(R.string.question4_2_answer1, R.string.question4_2_answer2),
listOf(R.string.question4_3_answer1, R.string.question4_3_answer2)
),
)
3 override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
questionType = it.getInt(ARG_QUESTION_TYPE)
/**
*arguments의 bundle로 숫자가 들어옴
*숫자가 들어왔을 때 question 타입에다가 ARG_QUESTION_TYPE 넣으면
* questionType으로 몇번 화면인지 받음.
*/
}
}
4 override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_question, container, false)
/**
*새로운 .xml(fragment_question.xml)로 프레그먼트 화면을 만듦.
*constraintlayout_ LinearLayout: 그 화면 내에서 활용.
*RadioGroup_ RadioButton: 하나가 선택될 때 하나는 선택되지 않음.
*레이아웃의 화면이 전환될때 마다 글자를 변경해주는 코드 작성.
*/
val title: TextView = view.findViewById(R.id.tv_question_title)
title.text = getString(questionTitles[questionType])
//questionTitles의 questionType번째를 getString
val questionTextViews = listOf<TextView>(
view.findViewById(R.id.tv_question_1),
view.findViewById(R.id.tv_question_2),
view.findViewById(R.id.tv_question_3)
)
val answerRadioGroups = listOf<RadioGroup>(
view.findViewById(R.id.rg_answer_1),
view.findViewById(R.id.rg_answer_2),
view.findViewById(R.id.rg_answer_3)
)
for (i in questionTextViews.indices) {
//반복문 for문으로 questionTextViews 반복
questionTextViews[i].text = getString(questionTexts[questionType][i])
//questionTextViews의 i(0)번째 text에 questionTexts의 questionType][i] i번째 getString
val radioButton1 = answerRadioGroups[i].getChildAt(0) as RadioButton
val radioButton2 = answerRadioGroups[i].getChildAt(1) as RadioButton
//answerRadioGroups[i]의 getChildAt(0)번째 인덱스 가져와 RadioButton 만듦.
radioButton1.text = getString(questionAnswers[questionType][i][0])
radioButton2.text = getString(questionAnswers[questionType][i][1])
//questionAnswers의 questionType][i][0] i번째의 질문지 0 getString
}
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//질문이 선택되면 작업이 이루어지는 액션을 정의
super.onViewCreated(view, savedInstanceState)
val answerRadioGroups = listOf<RadioGroup>(
view.findViewById(R.id.rg_answer_1),
view.findViewById(R.id.rg_answer_2),
view.findViewById(R.id.rg_answer_3)
)
val btnNext: Button = view.findViewById(R.id.btn_next)
//'다음' 버튼이 눌려졌을 때 클릭처리
btnNext.setOnClickListener {
//모든 질문이 선택이 되어있는지에 대한 예외 처리
val isAllAnswered = answerRadioGroups.all { it.checkedRadioButtonId != -1 }
//answerRadioGroups의 all을 사용: 전부 체크가 되어 있는지 확인
//{ it.checkedRadioButtonId != -1 }: '-1'는 체크가 되어 있지 않을 때
if (isAllAnswered) {
val responses = answerRadioGroups.map { radioGroup ->
//무슨 응답을 했는지 뽑아내야 함.
val firstRadioButton = radioGroup.getChildAt(0) as RadioButton
//first만 하는 이유: 첫번째만 체크가 되어있는지 확인하면 나머지는 알 수 있기 때문.
if (firstRadioButton.isChecked) 1 else 2
}
(activity as? TestActivity)?.questionnaireResults?.addResponses(responses)
(activity as? TestActivity)?.moveToNextQuestion()
//TestActivity의 add에 responses(응답갯수가 제일 많은거)을 넣어줌.
} else {
Toast.makeText(context, "모든 질문에 답해주세요.", Toast.LENGTH_SHORT).show()
}
}
if(questionType==3){
btnNext.setText("결과 확인")
}
}
1 companion object {
//생성자.
private const val ARG_QUESTION_TYPE = "questionType"
//새로운 페이지를 받기 전 페이지 번호부터 받아야 함.
fun newInstance(questionType: Int): QuestionFragment {
//testActivity에서 새로운 viewpager을 부를 때 마다 nextItem을 넘겼는데 그 번호를 받아줄 곳이 필요함
val fragment = QuestionFragment()
val args = Bundle()
//데이터는 받을 때: Bundle
args.putInt(ARG_QUESTION_TYPE, questionType)
//새로운 페이지의 페이지 번호를 전달
fragment.arguments = args
return fragment
/**
*testActivity_ viewpager 새로운 페이지를 부를 때
*ViewPagerAdapter.kt_ createFragment 발생.
*class ViewPagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
override fun getItemCount(): Int {
return 4
}
override fun createFragment(position: Int): Fragment {
return QuestionFragment.newInstance(position)
}
}
*reateFragment(position: Int) position이 같이 들어옴.
*1p > 2p를 부를 때, 새로운 프레그먼트를 만들면서 return QuestionFragment.newInstance(position)
*args.putInt(ARG_QUESTION_TYPE, questionType) 다음 페이지를 만듦.
*return fragment 을 새로 띄움.
*/
}
}
}