简体   繁体   English

Android Studio 3.1.3 中的错误。 java.lang.IllegalStateException: 无法执行 android:onClick 的方法

[英]Error in Android Studio 3.1.3. java.lang.IllegalStateException: Could not execute method for android:onClick

I am new to Android.我是安卓新手。 I am creating Tic Tac Toe game and I am getting error while clicking on button to play again.我正在创建 Tic Tac Toe 游戏,但在单击按钮再次播放时出现错误。 I am enclosing my code.我附上了我的代码。

I want to learn why it is isn't working so I can better help myself next time.我想了解为什么它不起作用,以便下次我可以更好地帮助自己。 The game logic is working fine.游戏逻辑运行良好。 When a player won, a layout pop up and congrts player and a button for "play Again" and when I click which call onClickfunction "PlayAgain" on that button it crashes.当玩家获胜时,会弹出一个布局并显示玩家和“再次播放”按钮,当我单击该按钮上的 onClickfunction“再次播放”时,它会崩溃。

This is My MainActivity.java Code:这是我的MainActivity.java 代码:

package com.example.kiran.tictactoegame;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


    //0 = Yellow and 1 = Red
    int activePlayer = 0 ;
    boolean gameIsActive=true;
    // 2 means block is unplayed
    int[] gameState={2,2,2,2,2,2,2,2,2};
    int [][] winningPositions={{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};


    public void dropIn(View view)
    {
        ImageView counter = (ImageView) view;  //this is the tap where use tap on screen which we pass it in function
        //System.out.println(counter.getTag().toString());
        int tappedCounter = Integer.parseInt(counter.getTag().toString());

        // if statement to see if that block is already played or not and if not then place dice
        if(gameState[tappedCounter]==2 && gameIsActive) {
            counter.setTranslationY(-1000f);
            gameState[tappedCounter]=activePlayer;
           // if statement to find whose chance is it to play
            if (activePlayer == 0) {
                counter.setImageResource(R.drawable.yellow);
                activePlayer = 1;
            } else {
                counter.setImageResource(R.drawable.red);
                activePlayer = 0;
            }
            counter.animate().translationYBy(1000f).setDuration(300);
        }
        // for loop to see if someone won
        for(int[] winningPosition : winningPositions)
        {
            // we are checking if all 3 position are same (either 0 for player one or 1 for player 2) is same and not 2 (means empty)
            if (gameState[winningPosition[0]]==gameState[winningPosition[1]] &&
                    gameState[winningPosition[1]]==gameState[winningPosition[2]] &&
                    gameState[winningPosition[0]]!=2) {
                // someone won
                    gameIsActive=false;
                    String winner="Red";
                if(gameState[winningPosition[0]]==0){
                    winner="Yellow";
                }
                TextView winnerMassage = (TextView) findViewById(R.id.winnerText);
                winnerMassage.setText(winner + " Has Won!");
                LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
                layout.setVisibility(view.VISIBLE);

            }
        }
    }

    public void playAgain(View view)
    {
        Toast.makeText(MainActivity.this,"PlayAgain",Toast.LENGTH_LONG).show();
        LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
        layout.setVisibility(view.INVISIBLE);
        //0 = Yellow and 1 = Red
        activePlayer = 0 ;
        gameIsActive=true;
        // 2 means block is unplayed
        //gameState={2,2,2,2,2,2,2,2,2}; cannot get again like this so for doing it we use Loop
        for(int i=0;i<gameState.length;i++)
        {
            gameState[i]=2;
        }
        // to set all sources of dice to null
      GridLayout gridLayout= (GridLayout) findViewById(R.id.gridLayout);
       for(int i=0;i<gridLayout.getChildCount();i++)
        {
            ((ImageView) gridLayout.getChildAt(i)).setImageResource(0); // it will get all the child of grid view(which is image view and set its source to NULL
        }

    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

And this is Error I am Getting ErrorLog这是错误我得到错误日志

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.kiran.tictactoegame, PID: 18702
                  java.lang.IllegalStateException: Could not execute method for android:onClick
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
                      at android.view.View.performClick(View.java:6597)
                      at android.view.View.performClickInternal(View.java:6574)
                      at android.view.View.access$3100(View.java:778)
                      at android.view.View$PerformClick.run(View.java:25883)
                      at android.os.Handler.handleCallback(Handler.java:873)
                      at android.os.Handler.dispatchMessage(Handler.java:99)
                      at android.os.Looper.loop(Looper.java:193)
                      at android.app.ActivityThread.main(ActivityThread.java:6642)
                      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:858)
                   Caused by: java.lang.reflect.InvocationTargetException
                      at java.lang.reflect.Method.invoke(Native Method)
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
                      at android.view.View.performClick(View.java:6597) 
                      at android.view.View.performClickInternal(View.java:6574) 
                      at android.view.View.access$3100(View.java:778) 
                      at android.view.View$PerformClick.run(View.java:25883) 
                      at android.os.Handler.handleCallback(Handler.java:873) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:193) 
                      at android.app.ActivityThread.main(ActivityThread.java:6642) 
                      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:858) 
                   Caused by: java.lang.ClassCastException: android.support.v7.widget.GridLayout cannot be cast to android.widget.GridLayout
                      at com.example.kiran.tictactoegame.MainActivity.playAgain(MainActivity.java:81)
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384) 
                      at android.view.View.performClick(View.java:6597) 
                      at android.view.View.performClickInternal(View.java:6574) 
                      at android.view.View.access$3100(View.java:778) 
                      at android.view.View$PerformClick.run(View.java:25883) 
                      at android.os.Handler.handleCallback(Handler.java:873) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:193) 
                      at android.app.ActivityThread.main(ActivityThread.java:6642) 
                      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:858) 
I/Process: Sending signal. PID: 18702 SIG: 9
Application terminated.

Change改变

import android.widget.GridLayout;

To

import android.support.v7.widget.GridLayout;

Because error shows cast exception.因为错误显示强制转换异常。

Just try this, Issue in the below line试试这个,在下面的行中发出

LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
layout.setVisibility(view.INVISIBLE);

Initialize your LinearLayout in onCreate and you can use it in onClick function.onCreate初始化您的LinearLayout ,您可以在onClick函数中使用它。

That's why it is showing as IllegalStateException这就是为什么它显示为IllegalStateException

Your error is generating at onClick method because you are calling android:onClick in xml but not handling the click in java file There must be a method in your java file:您的错误是在onClick方法中生成的,因为您在 xml 中调用android:onClick但没有处理 java 文件中的点击 您的 java 文件中必须有一个方法:

@Override
public void onClick(View view) {

}

Or you can use it like this:或者你可以像这样使用它:

view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

Thank you everyone.谢谢大家。 it helped me to resolve my problem.它帮助我解决了我的问题。 this was the solutions.这就是解决方案。

Change改变

import android.widget.GridLayout;

To

import android.support.v7.widget.GridLayout;

You will find the below answer useful;您会发现以下答案很有用;

import androidx.gridlayout.widget.GridLayout导入 androidx.gridlayout.widget.GridLayout

In the top page of your MainActivity.java在 MainActivity.java 的首页

Edit the existing编辑现有

"import.android.widget.GridLayout " “import.android.widget.GridLayout”

as作为

"import androidx.gridlayout.widget.GridLayout" “导入androidx.gridlayout.widget.GridLayout”

Just now I also tried it and it worked for me.!!刚才我也试过了,它对我有用。!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 错误:java.lang.IllegalStateException:无法执行android:onClick的方法 - Error: java.lang.IllegalStateException: Could not execute method for android:onClick java.lang.IllegalStateException:无法执行android:onClick的方法 - java.lang.IllegalStateException: Could not execute method for android:onClick in android java.lang.IllegalStateException:无法为 android 执行方法:onClick / ZE84E30B9390CDB67ZDDB6 - java.lang.IllegalStateException: Could not execute method for android:onClick / Android Kotlin-java.lang.IllegalStateException:无法执行android:onClick的方法 - Kotlin - java.lang.IllegalStateException: Could not execute method for android:onClick Android Studio Application - java.lang.IllegalStateException: Could not execute method for android:onClick - Not a Null Pointer Exception - Android Studio Application - java.lang.IllegalStateException: Could not execute method for android:onClick - Not a Null Pointer Exception Android Studio 问题; java.lang.IllegalStateException: 无法执行 android:onClick 的方法 - Android Studio problem ; java.lang.IllegalStateException: Could not execute method for android:onClick ANDROID意图致命错误!!! java.lang.IllegalStateException: 无法执行 android:onClick 的方法 - ANDROID INTENTION FATAL ERROR!!! java.lang.IllegalStateException: Could not execute method for android:onClick 得到运行时错误“ java.lang.IllegalStateException:无法执行android:onClick的方法” - getting runtime error “java.lang.IllegalStateException: Could not execute method for android:onClick” 代码错误:java.lang.IllegalStateException:无法执行android:onClick的方法 - Error in code: java.lang.IllegalStateException: Could not execute method for android:onClick Tictac toe 游戏不断停止并出现 logcat 错误 java.lang.IllegalStateException:Could not execute method for android:onClick - Tictac toe game keeps stopping with logcat error java.lang.IllegalStateException:Could not execute method for android:onClick
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM