[英]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.