首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法执行android的方法:onClick

无法执行android的方法:onClick
EN

Stack Overflow用户
提问于 2020-11-02 01:59:22
回答 2查看 851关注 0票数 0

大家好,开发者们,我是学习android开发的新手,我用Kotlin做了一个tic tac toe游戏,它运行得很好,但我写了一个函数,让设备和我玩,但我得到了这个错误

代码语言:javascript
复制
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ticgame, PID: 28043
java.lang.IllegalStateException: Could not execute method for android:onClick
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
    at android.view.View.performClick(View.java:5338)
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
    at android.view.View$PerformClick.run(View.java:21539)
    at android.os.Handler.handleCallback(Handler.java:819)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:210)
    at android.app.ActivityThread.main(ActivityThread.java:5982)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
    at android.view.View.performClick(View.java:5338) 
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992) 
    at android.view.View$PerformClick.run(View.java:21539) 
    at android.os.Handler.handleCallback(Handler.java:819) 
    at android.os.Handler.dispatchMessage(Handler.java:104) 
    at android.os.Looper.loop(Looper.java:210) 
    at android.app.ActivityThread.main(ActivityThread.java:5982) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742) 
 Caused by: java.lang.IllegalArgumentException: n <= 0: 0
    at java.util.Random.nextInt(Random.java:182)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:132)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.buClick(MainActivity.kt:43)
    at java.lang.reflect.Method.invoke(Native Method) 
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
    at android.view.View.performClick(View.java:5338) 
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992) 
    at android.view.View$PerformClick.run(View.java:21539) 
    at android.os.Handler.handleCallback(Handler.java:819) 
    at android.os.Handler.dispatchMessage(Handler.java:104) 
    at android.os.Looper.loop(Looper.java:210) 
    at android.app.ActivityThread.main(ActivityThread.java:5982) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742) 

主要活动

代码语言:javascript
复制
package com.example.ticgame
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import java.util.Random
import android.widget.Button


class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

}

var activePlayer=1

var player1=ArrayList<Int>()

var player2=ArrayList<Int>()

var Draw:Int=0

单击函数

代码语言:javascript
复制
fun buClick(View:View) {
    val BuSelected= View as  Button
    var CellId=0

    when(BuSelected.id){
        R.id.button1-> CellId = 1
        R.id.button2-> CellId = 2
        R.id.button3-> CellId = 3
        R.id.button4-> CellId = 4
        R.id.button5-> CellId = 5
        R.id.button6-> CellId = 6
        R.id.button7-> CellId = 7
        R.id.button8-> CellId = 8
        R.id.button9-> CellId = 9
    }
     Log.d("buCliked",BuSelected.id.toString())
      Log.d("buCliked", CellId.toString())
    PLayGame(CellId,BuSelected)

}

玩游戏功能

代码语言:javascript
复制
fun PLayGame(CellId:Int,BuSelected:Button ) {
    
    
 if (activePlayer==1){
     Toast.makeText(this,"Player 1 played X",Toast.LENGTH_SHORT).show()
     BuSelected.text="X"
     BuSelected.setBackgroundResource(R.color.Blue)
     player1.add(CellId)
     AutoPlay()
     Draw++
     activePlayer=2
 }else {
     Toast.makeText(this,"Player 2 played O",Toast.LENGTH_SHORT).show()
     BuSelected.text="O"
     BuSelected.setBackgroundResource(R.color.Green)
     player2.add(CellId)
     Draw++
     activePlayer=1
 }
    BuSelected.isEnabled=false //No one can't Click on button againe
    CheckWinner(BuSelected)
}

Check Winner函数

代码语言:javascript
复制
fun CheckWinner(BuSelected:Button ){
    var Winner:Int=-1
    //row 1
    if(player1.contains(1) && player1.contains(2) && player1.contains(3)){ Winner=1 }
    else if(player2.contains(1) && player2.contains(2) && player2.contains(3)){ Winner=2}


    //row 2
    if(player1.contains(4) && player1.contains(5) && player1.contains(6)){ Winner=1 }
    else if(player2.contains(4) && player2.contains(5) && player2.contains(6)){Winner=2}


    //row 3
    if(player1.contains(7) && player1.contains(8) && player1.contains(8)){ Winner=1 }
    else if(player2.contains(7) && player2.contains(8) && player2.contains(9)){Winner=2}


    /////////////////////////////colums////////////////////////////////////////////////////

    //colum 1
    if(player1.contains(1) && player1.contains(4) && player1.contains(7)){ Winner=1 }
    else if(player2.contains(1) && player2.contains(4) && player2.contains(7)){ Winner=2}


    //colum 2
    if(player1.contains(2) && player1.contains(5) && player1.contains(8)){ Winner=1 }
    else if(player2.contains(2) && player2.contains(5) && player2.contains(8)){Winner=2}


    //colum 3
    if(player1.contains(3) && player1.contains(6) && player1.contains(9)){ Winner=1 }
    else if(player2.contains(3) && player2.contains(6) && player2.contains(9)){Winner=2}

  ////////////////////////////////digonale//////////////////////////////////////

    // main digonale
    if(player1.contains(1) && player1.contains(5) && player1.contains(9)){ Winner=1 }
    else if(player2.contains(1) && player2.contains(5) && player2.contains(9)){Winner=2}

    //non-main digonale
    if(player1.contains(3) && player1.contains(5) && player1.contains(7)){ Winner=1 }
    else if(player2.contains(3) && player2.contains(5) && player2.contains(7)){Winner=2}

    //Check Winner
    if (Winner==1){ Toast.makeText(this,"Player 1 is Winner",Toast.LENGTH_LONG).show() }

    else if(Winner==2){ Toast.makeText(this,"Player 2 is Winner",Toast.LENGTH_LONG).show() }

    else if(Draw==9){Toast.makeText(this," Draw ",Toast.LENGTH_LONG).show()}
}

AutoPlay函数当我编写此函数并运行应用程序并按下游戏中的任意按钮时发生错误

代码语言:javascript
复制
fun AutoPlay(){

    var emptyCells= ArrayList<Int>()

    for(cellId in 1..9 ) {
        if ( !(player1.contains(cellId) || player2.contains(cellId)) ){
            emptyCells.add(cellId)
        }
    }

    val r= Random()
    var randIndex=r.nextInt(emptyCells.size)
    var cellId=emptyCells[randIndex]

    val buSelected : Button?

    buSelected=when(cellId){
        1-> {button1}
        2-> {button2}
        3-> {button3}
        4-> {button4}
        5-> {button5}
        6-> {button6}
        7-> {button7}
        8-> {button8}
        9-> {button9}
        else-> {button1}
    }
        PLayGame(cellId,buSelected)

}

}

EN

回答 2

Stack Overflow用户

发布于 2020-11-02 03:21:26

当你想通过实现onClickListener接口向XML文件中的一个元素添加onClick动作时,你可以使用kotlin的android扩展也要记住将它作为apply plugin: kotlin-android-extensions添加到你的应用程序的build.gradle文件中,然后在你的活动中,你可以通过它的id访问你的元素,并添加on element_id.setOnClickListener{ onClickFunction()},然后你可以调用你的函数,比如example或者其他一些东西

票数 0
EN

Stack Overflow用户

发布于 2020-11-02 10:23:46

看看你的堆栈跟踪-它被组织成不同的级别,每个级别都是由下一个异常引起的异常。每个异常都有一个导致异常发生的方法调用列表(最上面的是最近的):

代码语言:javascript
复制
java.lang.IllegalStateException: Could not execute method for android:onClick
    ...
Caused by: java.lang.reflect.InvocationTargetException
    ...
Caused by: java.lang.IllegalArgumentException: n <= 0: 0
    at java.util.Random.nextInt(Random.java:182)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:132)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
    at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
    ...

最后一个异常是重要的异常,如果你从下往上阅读,你可以看到导致异常的原因。最后发生的事情是PLayGame调用AutoPaly,后者调用Random.nextInt,该调用抛出一个异常,并显示以下消息:

代码语言:javascript
复制
java.lang.IllegalArgumentException: n <= 0: 0

这说明您使用0值调用了Random.nextInt,如果该值为<= 0,则会抛出异常。调用它的代码(根据堆栈跟踪,MainActivity.kt的第132行,它告诉您在哪里查找;)正在执行以下操作:

代码语言:javascript
复制
var randIndex=r.nextInt(emptyCells.size)

因此,在某个时刻,当大小为0时,emptyCells可能是空的,这就是它崩溃的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64635150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档