1

I'm trying to make a tic-tac-toe game. I get the following error when I click on one of the boxes, Initially, it worked, but when I started developing it suddenly stopped working. How can I debug this error?

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.tres_en_ralla, PID: 3943
    java.lang.IllegalStateException: Could not find method toque(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatImageView with id 'b2'
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:436)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:393)
        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)


My Main Activity is this:

package com.example.tres_en_ralla;

import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.Gravity;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private int jugadores;
    private Partida partida;
    private int [] casillas;


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

        // Iniciamos el array casillas que identifica cada casilla, y la almacena.

        casillas = new int[9];

        casillas[0] = R.id.a1;
        casillas[1] = R.id.a2;
        casillas[2] = R.id.a3;
        casillas[3] = R.id.b1;
        casillas[4] = R.id.b2;
        casillas[5] = R.id.b3;
        casillas[6] = R.id.c1;
        casillas[7] = R.id.c2;
        casillas[8] = R.id.c3;

    }
    //rescata los datos e inactiva los botones.
    public void aJugar(View vista){

        ImageView imagen;

        //Limpiamos las casillas.
        for (int c:casillas) {
            imagen = (ImageView) findViewById((c));
            imagen.setImageResource(R.drawable.casilla);
        }
        jugadores = 1;

        if(vista.getId()==R.id.dosJug) {

            jugadores = 2;
        }
        RadioGroup botones = findViewById(R.id.rdgDificultad);

        int id = botones.getCheckedRadioButtonId();

        id = 0;

        int dificultad=0;

        if(id==R.id.medio){
            dificultad=1;
        }else if (id==R.id.imposible){
            dificultad=2;
        }

        partida = new Partida(dificultad);

        ((Button)findViewById(R.id.unJug)).setEnabled(false);

        //setAlpha establece la transparencia a 0.

        ((RadioGroup) findViewById(R.id.rdgDificultad)).setAlpha(0);

        ((Button) findViewById(R.id.dosJug)).setEnabled(false);

    }

    //Rescata la casilla pulsada y se la pasa a marca().
    private void toque(View miVista) {

        if(partida==null){
           return;
        }

        int cas = 0;

        for (int i = 0; i < 9; i++) {

            if (casillas[i] == miVista.getId()) {

                cas = i;

                break;
            }
        }

        if(!partida.compruebaCasilla(cas)) {
            return;
        }
            marca(cas);

            partida.turno();

            int cas_ia = partida.ia();

            marca(partida.ia());

            partida.turno();

    }
    //Establece la imagen de fondo.
    private void marca(int casilla){

        ImageView imagen;

        imagen = (ImageView) findViewById(casillas[casilla]);

        if(partida.getJugadores()==1){

            imagen.setImageResource(R.drawable.circulo);

        }else {

            imagen.setImageResource(R.drawable.aspa);

        }
    }
}

My activity_main.xml is this:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:background="@drawable/fondo"
    android:orientation="horizontal"
    android:padding="@dimen/padding_pantalla"
    tools:context=".MainActivity">
    <Space
        android:layout_width="0dp"
        android:layout_height="2dp"
        android:layout_weight="0.5"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="center_horizontal"
        android:orientation="vertical">
        <TextView
            style="@style/titulo"
            android:text="@string/app_name" />
        <Button
            android:id="@+id/unJug"
            style="@style/button"
            android:layout_height="60dp"
            android:layout_width="wrap_content"
            android:text="@string/un_jugador" />

        <RadioGroup
            android:id="@+id/rdgDificultad"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <RadioButton
                android:id="@+id/facil"
                style="style/radio"
                android:text="@string/facil" />

            <RadioButton
                android:id="@+id/medio"
                style="style/radio"
                android:text="@string/normal" />

            <RadioButton
                android:id="@+id/imposible"
                style="style/radio"
                android:text="@string/Imposible" />

        </RadioGroup>

        <Button
            android:id="@+id/dosJug"
            style="@style/button"
            android:text="@string/dos_jugador" />


    </LinearLayout>

    <Space
        android:layout_width="0dp"
        android:layout_height="2dp"
        android:layout_weight="0.5"/>

    <GridLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:columnCount="3"
        android:rowCount="3">

        <ImageView
            android:id="@+id/a1"
            style="@style/casillas"

            />

        <ImageView
            android:id="@+id/c1"
            style="@style/casillas"

            />

        <ImageView
            android:id="@+id/a2"
            style="@style/casillas"
            android:src= "@drawable/circulo"
            />

        <ImageView
            android:id="@+id/a3"
            style="@style/casillas"
            />
        <ImageView
            android:id="@+id/c2"
            style="@style/casillas"
            android:src= "@drawable/circulo"
            />

        <ImageView
            android:id="@+id/c3"
            style="@style/casillas"
            />
        <ImageView
            android:id="@+id/b1"
            style="@style/casillas"
            android:src= "@drawable/circulo"
            />
        <ImageView
            android:id="@+id/b2"
            style="@style/casillas"
            android:src= "@drawable/aspa"
            />

        <ImageView
            android:id="@+id/b3"
            style="@style/casillas"
            android:src= "@drawable/aspa"
            />
รง
    </GridLayout>
</LinearLayout>

l-l
  • 3,804
  • 6
  • 36
  • 42
Manuel Lucas
  • 636
  • 6
  • 17
  • Does this answer your question? [Could not find method in parent or ancestor context](https://stackoverflow.com/questions/38392359/could-not-find-method-in-parent-or-ancestor-context) โ€“ Ryan M Jul 16 '20 at 23:41

1 Answers1

1

Android components cannot locate toque method because it is private.

Change access modifier to be public:

public void toque(View miVista) { ...
Jenea Vranceanu
  • 4,530
  • 2
  • 18
  • 34