연습장/실습

MBTI 테스트_ QuestionFragment.kt

아이른 2024. 1. 24. 16:00

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() {
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 을 새로 띄움.

*/

       }
    }
}