I created a project that contains a grid layout and a linear layout. There are some ImageView in grid layout. At first, I set the linear layout to invisible and set the grid layout visible. Under those ImageViews, I add onClick method. When I click those images, the onClick method will change the grid layout to invisible and linear layout to visible. So the linear layout comes out and grid layout disappear. However, every time it changes the grid layout to invisible the App crashes and give me an exception:
ClassNotFoundException: Didn't find class
"android.view.View$OnUnhandledKeyEventListener"
but it's fine for changing linear layout to visible.
I already searched Google and checked my code but I cannot find any problem..
I checked step by step and I found that the crash comes out only for change the grid layout to invisible. I also created a new simple project for testing it but still had this problem.
GridLayout mainLayout = (GridLayout)findViewById(R.id.gridLayout);
mainLayout.setVisibility(View.INVISIBLE);
LinearLayout winnerLayout =
(LinearLayout)findViewById(R.id.winnerLayout);
winnerLayout.setVisibility(View.VISIBLE);
XML:
?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.GridLayout
android:id="@+id/gridLayout"
android:layout_width="0dp"
android:layout_height="413dp"
android:background="@drawable/board"
android:visibility="visible"
app:columnCount="3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:rowCount="3"
>
<ImageView
android:id="@+id/imageView1"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginTop="0dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="0"
app:layout_column="0"
app:layout_row="0"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginLeft="7dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="1"
app:layout_column="1"
app:layout_row="0"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginLeft="4dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="2"
app:layout_column="2"
app:layout_row="0"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView4"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginTop="20dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="3"
app:layout_column="0"
app:layout_row="1"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView5"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginLeft="7dp"
android:layout_marginTop="20dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="4"
app:layout_column="1"
app:layout_row="1"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView6"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginLeft="4dp"
android:layout_marginTop="20dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="5"
app:layout_column="2"
app:layout_row="1"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView7"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginTop="15dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="6"
app:layout_column="0"
app:layout_row="2"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView8"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginLeft="7dp"
android:layout_marginTop="15dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="7"
app:layout_column="1"
app:layout_row="2"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
<ImageView
android:id="@+id/imageView9"
android:layout_width="134dp"
android:layout_height="125dp"
android:layout_marginLeft="4dp"
android:layout_marginTop="15dp"
android:onClick="dropIn"
android:scaleType="fitCenter"
android:tag="8"
app:layout_column="2"
app:layout_row="2"
tools:layout_editor_absoluteX="180dp"
tools:layout_editor_absoluteY="162dp" />
</android.support.v7.widget.GridLayout>
<LinearLayout
android:id="@+id/winnerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="invisible"
>
<TextView
android:id="@+id/winnerText"
android:layout_width="310dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:fontFamily="@font/finger_paint"
android:gravity="center"
android:text="Yellow Won"
android:textAlignment="center"
android:textColor="@android:color/holo_red_light"
android:textSize="70sp"
android:typeface="monospace"
tools:layout_editor_absoluteY="222dp" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>
Logcat:
--------- beginning of crash
2019-01-28 12:05:15.704 5002-5002/sailorsinbad.com.udemy5_clock_rotation
E/AndroidRuntime: FATAL EXCEPTION: main
Process: sailorsinbad.com.udemy5_clock_rotation, PID: 5002
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:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:
438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
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:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.ClassCastException: android.support.v7.widget.GridLayout cannot be cast to android.widget.GridLayout
at sailorsinbad.com.udemy5_clock_rotation.MainActivity.resetAndNextGame(MainActivity.java:36)
at sailorsinbad.com.udemy5_clock_rotation.MainActivity.dropIn(MainActivity.java:72)
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:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
--------- beginning of system
UPDATE
I follow this link (android/view/view$onUnhandledKeyEventListener (onMeasure error)) to change the sdk from 28 to 27 like this:
compileSdkVersion 27
targetSdkVersion 27
implementation 'com.android.support:appcompat-v7:27.1.1'
I synced Gradle and run it but still crashed. My MainActivity CODE:
package sailorsinbad.com.udemy5_clock_rotation;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
boolean winningState = false;
int isRed = 1;
//red is 1; yellow is 2
int[] gameState = {0,0,0,0,0,0,0,0,0};
int[][] winningCondition = {
{0,1,2}, {3,4,5}, {6,7,8},
{0,3,6}, {1,4,7}, {2,5,8},
{0,4,8}, {2,4,6}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void animationDropIn(View drop) {
drop.setTranslationY(-1000f);
drop.animate().translationYBy(1000f).rotation(720).setDuration(250);
}
public void resetAndNextGame(String winner){
//switch to winner layout
GridLayout mainLayout = (GridLayout)findViewById(R.id.gridLayout);
mainLayout.setVisibility(View.INVISIBLE);
LinearLayout winnerLayout =
(LinearLayout)findViewById(R.id.winnerLayout);
winnerLayout.setVisibility(View.VISIBLE);
TextView text = (TextView)findViewById(R.id.winnerText);
text.setText(winner);
}
public void dropIn(View view) {
//catch current rectangle building block area (View)
ImageView drop = (ImageView) view;
//drop-in animation
//2 sides cross drop in, prevent repeat drop, record game state
int tagNum= Integer.parseInt(drop.getTag().toString());
//System.out.println(tagNum);
if (!winningState) {
if (isRed == 1 && gameState[tagNum] == 0) {
drop.setImageResource(R.drawable.red);
gameState[tagNum] = isRed;
animationDropIn(drop);
isRed = 2;
} else if (isRed == 2 && gameState[tagNum] == 0) {
drop.setImageResource(R.drawable.yellow);
gameState[tagNum] = isRed;
animationDropIn(drop);
isRed = 1;
}
// System.out.println(gameState[tagNum]);
//game checking winning condition
for (int[] winniningPosition : winningCondition) {
if (gameState[winniningPosition[0]] ==
gameState[winniningPosition[1]]
&& gameState[winniningPosition[1]] ==
gameState[winniningPosition[2]] &&
gameState[winniningPosition[0]] != 0) {
if (isRed == 2) {
//reversed before
String win = "Red Win";
winningState = true;
resetAndNextGame(win);
} else {
String win = "Yellow Win";
winningState = true;
resetAndNextGame(win);
}
} else {
boolean isGameOver = true;
for (int counter : gameState) {
if (counter == 0) {
isGameOver = false;
}
}
if (isGameOver) {
String win = "Draw";
winningState = true;
resetAndNextGame(win);
}
}
}
}
}
}
My build.Gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "sailorsinbad.com.udemy5_clock_rotation"
minSdkVersion 21
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependencies {
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-
core:3.0.2'
implementation 'com.android.support:gridlayout-v7:27.1.1'
}