Исправление ошибки с преобразованием Gridlayout в ImageView

У меня есть файл .xml, настроенный как

<GridLayout
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_centerVertical = "true"
    android:layout_centerHorizontal = "true"
    android:columnCount = "4"
    android:rowCount = "6"
    android:onClick = "dropIn"
    android:layout_alignParentEnd = "true"
    android:id = "@+id/gridLayout">

    <ImageView
        android:id = "@+id/imageView1"
        android:layout_width = "80dp"
        android:layout_height = "70dp"
        android:layout_column = "0"
        tools:layout_editor_absoluteX = "288dp"
        tools:layout_editor_absoluteY = "180dp"
        android:layout_row = "0"
        android:onClick = "dropIn"
        android:contentDescription = "@null"
        android:tag = "1"
        app:srcCompat = "@drawable/stone" />

В любом случае, у меня гораздо больше ImageView, и то, что отличает их от других, - это идентификатор и тег. Я решил, что они будут распознаваться по коду по их тегу. Вот что у меня сейчас есть:

int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};

public void dropIn(View view) {

    ImageView counter = (ImageView) view;
    counter.setImageResource(R.drawable.stone);

    int tappedCounter = Integer.parseInt(counter.getTag().toString());
    try {
        if (gameState[tappedCounter] == 2 && gameIsActive) {

            gameState[tappedCounter] = 3;
            countMe = countMe - 1;
            counter.setVisibility(View.INVISIBLE);
        } else if (gameState[tappedCounter] == 3 && gameIsActive) {

            Toast.makeText(MainActivity.this, "That field is already played!",
                    Toast.LENGTH_SHORT).show();
        }
    } catch (Exception e) {
        Toast.makeText(MainActivity.this, "Oho!",
                Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }

Все это работает нормально, за исключением случаев, когда я нажимаю ImageView, который уже был нажат и теперь невидим, это приводит к сбою приложения со следующим сообщением:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.nedim.lastonestanding, PID: 9758
              java.lang.IllegalStateException: Could not execute method for android:onClick
                  at android.view.View$DeclaredOnClickListener.onClick(View.java:5374)
                  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.view.View$DeclaredOnClickListener.onClick(View.java:5369)
                  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.widget.GridLayout cannot be cast to android.widget.ImageView
                  at com.nedim.lastonestanding.MainActivity.dropIn(MainActivity.java:32)
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at android.view.View$DeclaredOnClickListener.onClick(View.java:5369) 
                  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) 
Application terminated.

Насколько я понимаю, изображение с ImageView исчезает, и теперь я нажимаю на GridLayout, а не на ImageView, что приводит к его сбою, поскольку это не то, с чем я хочу работать. Я также предполагаю, что проблема в том, что счетчик превращает все представления в ImageView, но я не уверен, как это исправить. Любые идеи? Спасибо!

Обновлено: метод onCreate

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

    TextView winMessage = findViewById(R.id.winMessage);
    winMessage.setText("Let's play! It's Player " + activePlayer + "'s turn.");
}

Оник, что ты имеешь в виду? Он никуда не вызывается, так как находится внутри public class MainActivity extends AppCompatActivity. Также dropIn (View view) - это onClick imageViews, но он нигде не вызывается в коде Java. Так должно быть?

victiMusPrime 27.05.2018 19:25

Понятно. Затем удалите android:onClick = "dropIn" из атрибутов xml GridLayout. Это вызывает сбой.

Onik 27.05.2018 19:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

view, который передается в функцию dropIn, - это GirdLayout, который вы пытаетесь преобразовать как ImageView.

GridLayout counter = (GridLayout) view;

Однако я вижу, что вы используете ту же функцию для обработки onClick из ImageView, чего вы не можете. Если вы хотите обрабатывать их обе, используя одну и ту же функцию, вы можете подумать о том, чтобы сделать что-то вроде этого.

public void dropIn(View view) {
    if (view.getId() == R.id.gridLayout) {
        // Handle action for GridLayout click
    } else if (view.getId() == R.id.imageView1) {
        // Handle the actions for ImageView click
    }
}

Лично я считаю, что вы неправильно вставили onClick в GridLayout. Так что просто опустите атрибут onClick из GridLayout xml.

<GridLayout
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_centerVertical = "true"
    android:layout_centerHorizontal = "true"
    android:columnCount = "4"
    android:rowCount = "6"
    <!-- android:onClick = "dropIn" -->
    android:layout_alignParentEnd = "true"
    android:id = "@+id/gridLayout">
Ответ принят как подходящий

У вас есть один и тот же атрибут android:onClick = "dropIn", объявленный как для GridLayout, так и для ImageView. 1-й вызывает ClassCastException на линии ImageView counter = (ImageView) view;

Другие вопросы по теме