gpt4 book ai didi

android - Android Studio Kotlin二维Button数组得到java.lang.ArrayIndexOutOfBoundsException:length = 0;索引= 0

转载 作者:行者123 更新时间:2023-12-02 13:43:53 41 4
gpt4 key购买 nike

我想和Kotlin做井字游戏。

按钮二维3x3,但收到此错误消息。我不知道 Kotlin 如何准确地声明二维数组并初始化,以及如何解决这个问题……

2020-03-28 16:27:45.705 30315-30315/com.leaf76.tictactoe E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.leaf76.tictactoe, PID: 30315
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.leaf76.tictactoe/com.leaf76.tictactoe.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3448)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7811)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at com.leaf76.tictactoe.MainActivity.onCreate(MainActivity.kt:46)
at android.app.Activity.performCreate(Activity.java:7955)
at android.app.Activity.performCreate(Activity.java:7944)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3423)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:237) 
at android.app.ActivityThread.main(ActivityThread.java:7811) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076) 

我宣布这个
.....
private var buttons = arrayOf<Array<Button>>()
private var player1Turn: Boolean = true
.....

我使用循环将 View 按钮ID添加到按钮数组,并使按钮单击更改文本“X”和“O”
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

textViewPlayer1 = text_view_p1
textViewPlayer2 = text_view_p2

for (i in 0 until 3) {
for (j in 0 until 3) {
val buttonId = "button_$i$j"
val resId = resources.getIdentifier(buttonId, "id", packageName)

buttons[i][j] = findViewById(resId) // **here got error**

buttons[i][j].setOnClickListener { v ->
if (player1Turn) {
(v as Button).text = "X"
} else {
(v as Button).text = "O"
}
....
}
}
}
}

最佳答案

您实际上已经用这一行代码声明了一个空数组。

arrayOf<Array<Button>>()

您需要向该数组添加一些项目。因此,您需要执行以下操作:
private var buttons = arrayOf<Array<Button>>(arrayOfNulls<Button>(3), arrayOfNulls<Button>(3), arrayOfNulls<Button>(3))

因此,在本部分中,我们将创建一个数组数组,其中包含3种可为空的Button类型。由于数组内部具有可为空的类型,因此无论访问数组项的位置如何,都需要使用 ?。例如,当您在单个Button上调用clickListener时,您需要这样做:
buttons[i][j]?.setOnClickListener

但以您为例,我不会使用数组来存储Button,而是会使用ArrayList,它可以动态接受项目。使用ArrayList,您的代码将如下所示:

数组声明:
private var buttons =  arrayOf<ArrayList<Button>>(arrayListOf(), arrayListOf(), arrayListOf())

用于循环:
for (i in 0 until 3) {
for (j in 0 until 3) {
val buttonId = "button_$i$j"
val resId = resources.getIdentifier(buttonId, "id", packageName)

buttons[i].add(findViewById(resId))

buttons[i][j].setOnClickListener { v ->
if (player1Turn) {
(v as Button).text = "X"
} else {
(v as Button).text = "O"
}
....
}
}

关于android - Android Studio Kotlin二维Button数组得到java.lang.ArrayIndexOutOfBoundsException:length = 0;索引= 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60899066/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com