2

Estoy intentando hacer una especie de juego que básicamente consiste en 2 pantallas, una de título y otra de juego. La de juego tiene una rotación de imágenes y 2 botones y la de título solo tiene el título y 2 botones. Lo único que tendría que pasar es que al iniciar se inicie la de título y al presionar el botón se cambie a la de juego, dentro de la de juego, una imagen cambiaría cada vez que se presione el botón.

El problema que tengo es que ni siquiera inicia la aplicación, este es el error que sale:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mosorior.bpbm, PID: 9764
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mosorior.bpbm/com.mosorior.bpbm.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
    at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:173)
    at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)
    at android.content.Context.obtainStyledAttributes(Context.java:744)
    at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:842)
    at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:809)
    at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:633)
    at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:259)
    at com.mosorior.bpbm.MainActivity.<init>(MainActivity.java:10)
    at java.lang.Class.newInstance(Native Method)
    at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
    at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

He pensado que puede ser cosa de alguna configuración mal puesta del Manifest, pero la verdad es que no tengo ni idea, he empezado hace muy poco con Android Studio. Dejo por aquí el Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mosorior.bpbm"
    tools:ignore="ExtraText">

    <application
        android:icon="@mipmap/icon"
        android:allowBackup="true"
        android:fullBackupContent="@xml/my_backup_rules"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.BPBM">

        <activity android:name=".MainActivity" android:icon="@drawable/icon">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity android:name="Ingame" android:parentActivityName=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.SED" />

                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />

        </activity>

    </application>
    
</manifest>

También el MainActivity.java:

package com.mosorior.bpbm;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ImageButton;

public class MainActivity extends AppCompatActivity {

    ImageButton play_btn = findViewById(R.id.play_btn);

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

        play_btn.setOnClickListener(v -> {
            Intent intent;
            intent = new Intent(MainActivity.this, Ingame.class);
            startActivity(intent);
        });


    }
}

El ActivityIngame (actividad secundaria):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    android:background="@drawable/background"
    android:id="@+id/container"
    tools:context=".Ingame">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="-57dp">

        <ImageView
            android:id="@+id/imgRandom"
            android:layout_width="match_parent"
            android:layout_height="500dp"
            android:layout_marginTop="25dp"
            app:srcCompat="@drawable/title"
            tools:srcCompat="@drawable/alcahueta_time"
            tools:ignore="ContentDescription" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <ImageButton
                android:id="@+id/next_btn"
                android:layout_width="210dp"
                android:layout_height="100dp"
                android:layout_gravity="bottom"
                android:layout_marginStart="20dp"
                android:layout_marginLeft="20dp"
                android:layout_marginBottom="25dp"
                android:layout_weight="1"
                android:gravity="bottom"
                android:scaleType="fitStart"
                app:srcCompat="@drawable/btn_next"
                tools:ignore="ContentDescription" />

            <Space
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

            <Space
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

            <ImageButton
                android:id="@+id/btn"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_gravity="bottom"
                android:gravity="bottom"
                android:layout_marginRight="20dp"
                android:layout_marginBottom="25dp"
                android:layout_weight="1"
                android:scaleType="fitStart"
                app:srcCompat="@drawable/btn"
                tools:ignore="ContentDescription,RtlHardcoded" />
        </LinearLayout>

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Y el Ingame.java:

package com.mosorior.bpbm;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import java.util.Random;

public class Ingame extends AppCompatActivity {

    private static final Random rgenerador = new Random();
    private static final Integer[] imagenesID=
            {R.drawable.alcahueta_time, R.drawable.anda_ya, R.drawable.arre_jamelgo, R.drawable.bailarina_ex_tica, R.drawable.batalla_de_gallos, R.drawable.beber_en_soledad, R.drawable.beber_por_un_calent_n, R.drawable.casar__matar__follar, R.drawable.comiendo_a_ciegas, R.drawable.duelo_a_muerte, R.drawable.el__ltimo_paga, R.drawable.el_mordisco_del_gringo, R.drawable.examen_sorpresa, R.drawable.highway_to_hell, R.drawable.hola_guapa, R.drawable.hoy_no_conduces, R.drawable.humano_en_pr_cticas, R.drawable.i_m_not_throwing_away_my_shot, R.drawable.influencer, R.drawable.insisto, R.drawable.joker, R.drawable.jugando_a_ser_hackers, R.drawable.la_cosa_se_pone_caliente, R.drawable.la_voluntad_de_la_moneda, R.drawable.mear_en_compa__a, R.drawable.mimo, R.drawable.no_hace_falta_bola, R.drawable.no_hace_falta_gimnasio, R.drawable.piercing_de_borrachera, R.drawable.pocky_game, R.drawable.por_la_futura_boda, R.drawable.quedas_libre_de_la_c_rcel, R.drawable.se_ve_que_te_gusta_beber, R.drawable.si_te_r_es_pierdes, R.drawable.sin_usar_las_manos, R.drawable.sing_along, R.drawable.t__oolong, R.drawable.trio, R.drawable.verdad_oculta, R.drawable.yamete_kudasai};


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

        Intent intent = getIntent();

        final ImageView iv;
        iv = findViewById(R.id.imgRandom);

        View next_btn = findViewById(R.id.next_btn);
        next_btn.setOnClickListener(v -> {
            int resource =
                    imagenesID[rgenerador.nextInt(imagenesID.length)];
            iv.setImageResource(resource);
        });

    }
}

Si podéis decirme cuál es el problema y como solucionarlo estaría muy agradecido. Si falta ver algún archivo no tengo problemas en pasarlo, como he dicho, soy bastante nuevo en esto y no sé apenas nada.

Gracias por adelantado.

Mosorior
  • 21
  • 1
  • ¿Responde esto a tu pregunta? [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados) – Nicolas Oñate Jul 15 '21 at 10:51

1 Answers1

1

Como que para empezar, tu botón no va a funcionar por como lo tienes declarado. Esto:

ImageButton play_btn = findViewById(R.id.play_btn);

Va dentro del onCreate:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ImageButton play_btn = findViewById(R.id.play_btn);
        //resto código

Segundo, esto:

        Intent intent;
        intent = new Intent(MainActivity.this, Ingame.class);
        startActivity(intent);

Se puede simplificar a esto:

        Intent intent = new Intent(MainActivity.this, Ingame.class);
        startActivity(intent);

Tercero: ¿Por qué declaras tu ImageButton next_btn como View en tu onCreate?

En tu layout:

<ImageButton
                android:id="@+id/next_btn"

En tu activity:

View next_btn = findViewById(R.id.next_btn);
Franqo Balsamo
  • 937
  • 1
  • 11
  • 34