Android Studio/Kotlin 中的抽认卡 Test/Memorization

Flashcards Test/Memorization in Andoird Studio/Kotlin

抱歉久了post!我正在尝试制作记忆抽认卡,我已经坚持了一个星期

这是数组

val sentenceArray = arrayOfNulls<String>(8)
    sentenceArray[0] = ""
    sentenceArray[1] = "Array 1 (1)"
    sentenceArray[2] = "Array 2 (2)"
    sentenceArray[3] = "Array 3 (3)"
    sentenceArray[4] = "Array 4 (4)"
    sentenceArray[5] = "Array 5 (5)"


这是代码。要生成测试,有 2 个微调器(左和右)如果用户为左微调器选择 1,在右微调器上选择 3,则每次用户单击 textView

时它只会显示数组 1 到 3
leftSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener
{
    override fun onNothingSelected(parent: AdapterView<*>?) {}
    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long)
    {
        //Stores value of the selected Left Spinner
        val selectedLeftSpinner = leftSpinner.getItemAtPosition(position).toString()

        rightSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener
        {
            override fun onNothingSelected(parent: AdapterView<*>?) {}
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long)
            {
                //Actions when buttonStart is clicked
                buttonStart.setOnClickListener {

                    //Stores value of the selected Right Spinner
                    val selectedRightSpinner = rightSpinner.getItemAtPosition(position).toString()

                    //Stores selectedLeftSpinner value to firstSentence so that it can be used
                    var firstSentence = selectedLeftSpinner.toInt()

                    //Stores selectedRightSpinner value to lastSentence so that it can be used
                    val lastSentence = selectedRightSpinner.toInt()

                    //Displays (1)
                    textView.text = sentenceArray[firstSentence]?.takeLast(3)

                    //Waiting for an action on the TextView
                    textView.setOnClickListener {

                        //Displays (Array 1)
                        textView.text = sentenceArray[firstSentence]

                        //Waiting for an action on the TextView
                        textView.setOnClickListener {
                            while (firstSentence < lastSentence) {

                                //This while loop displays Array 1 to 5 each time a user clicks on textView
                                firstSentence++

                                textView.text = sentenceArray[firstSentence]

                                //Ends the test when it reaches the last array
                                if (firstSentence == lastSentence) {
                                    buttonStart.text = "DONE"
                                }
                                break
                            }
                        }
                    }
                }
            }
        }
    }
}

我想做什么: 在用户从左侧微调器(例如 1)和右侧微调器(例如 3)中选择一个值后,他们将单击按钮开始以启动抽认卡。 textView 开始显示 (1)。为了揭示答案,他们可以点击 textView,然后它会显示 "Array 1" 然后他们会点击 textView,它会显示 (2)... 等等

所以流程应该是这样的,在每一步点击 textView 之后
(1)
数组 1
(2)
数组 2
(3)
Arra3 3
完成

使用我当前的 while 循环

while (firstSentence < lastSentence) {

                                //This loop displays Array 1 to 5 each time a user clicks on textView
                                firstSentence++

                                textView.text = sentenceArray[firstSentence]

                                //Ends the test when it reaches the last aya
                                if (firstSentence == lastSentence) {
                                    buttonStart.text = "DONE"
                                }
                                break
                            }

这是当前流量
(1)
数组 1
数组 2
数组 3
完成

我已经尝试了很多东西,但我无法让它工作,我不知道怎么办
这里有 2 个不同的代码,我试过但没有用。这是在 while 循环中

textView.setOnClickListener {
                                        if (textView.text == sentenceArray[firstSentence])
                                        textView.text = sentenceArray[firstSentence]?.takeLast(3)
                                    }

和这段代码

if (firstSentence < lastSentence)
                                    {
                                        textView.setOnClickListener {
                                            textView.text = sentenceArray[firstSentence]?.takeLast(3)
                                        }
                                    }

这 2 个代码导致此流程
(1)
数组 1
数组 2
(2)
当它应该继续到 (3)

时完成

您真的不需要循环,因为循环是由用户单击文本视图处理的,在您的情况下,if 条件就足够了。

我观察到的另一件事是您正在其他侦听器中设置点击侦听器和微调器侦听器。这不是必需的,并且会使您的代码难以阅读且解析起来很复杂,请注意,在您的情况下,您可以在同一级别定义所有侦听器以实现您想要的,您不必嵌套它们。

您可以执行以下操作。我已经解除了嵌套的侦听器配置。

   class Temp {

    lateinit var leftSpinner: Spinner
    lateinit var rightSpinner: Spinner
    lateinit var buttonStart: Button
    lateinit var sentenceArray: Array<String>
    lateinit var textView: TextView
    var selectedLeftSpinner = -1
    var selectedRightSpinner = -1

   private fun setup() {

        /** Define left spinner item selected listener, capture the selected position */
        leftSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {}
            override fun onItemSelected(
                parent: AdapterView<*>?, view: View?,
                position: Int, id: Long) {
                selectedLeftSpinner = position
            }
        }

        /** Define right spinner item selected listener, capture the selected position */
        rightSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {}
            override fun onItemSelected(
                parent: AdapterView<*>?, view: View?,
                position: Int, id: Long) {
                selectedRightSpinner = position
            }
        }

        /** Define button start click listener, show text if left spinner is selected. */
        buttonStart.setOnClickListener {
            /** only set text if left spinner is selecte */
            if(selectedLeftSpinner != -1){
                textView.text = sentenceArray[selectedLeftSpinner]?.takeLast(3)
            }
        }

/** Handle edge cases, such as what happens if spinner is not selected */
    textView.setOnClickListener {
        /** if currently selected item's last 3 chars are being shown,
         *  then show the answer.
         */
        if(textView.text == sentenceArray[selectedLeftSpinner]?.takeLast(3)){
            textView.text = sentenceArray[selectedLeftSpinner]
        }
        /** if answer is being shown then show last three chars of next item */
        else if(selectedLeftSpinner < selectedRightSpinner){
            selectedLeftSpinner++
            textView.text = sentenceArray[selectedLeftSpinner]?.takeLast(3)
        }
        /** else we have reached the last item */
        else{
            buttonStart.text = "DONE"
            /** reset left spinner to not selected state */
            selectedLeftSpinner = -1
        }
    }

    }
}

这应该可行,但我没有考虑任何边缘情况,因此您必须处理它们,还有 space 其他改进,例如使用键、值结构(ex map)到存储你的闪存卡问题和答案代码仍然可以减少,因为旋转器的两个听众是相同的,我把它留作练习。