我想和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"
}
....
}
}