El detector de eventos no funciona

A continuación se muestra el código de main activity class. Establece contenido para main.xml, que incluye un botón btn . Cuando se hace clic en este botón, el contenido se establece en pic.xml, que tiene dos botones, btn1 y btn2. Cuando el btn1 se hace clic, debe establecer el contenido de nuevo a main.xml pero esto no está pasando.

package com.asin.amit;

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;



import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.PixelFormat;


import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

public class AsinActivity extends Activity {
/** Called when the activity is first created. */
private TextView tv ;
private VideoView myVideoView;
private Button btn;
private Button btn1;
private Button btn2;


@Override


public void onCreate(Bundle savedInstanceState) {


    try {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.b);
        btn1 = (Button) findViewById(R.id.button1);
        btn2 = (Button) findViewById(R.id.button2);

        String str= "/sdcard/DCIM/a.mp4";


        tv = (TextView) findViewById(R.id.tv1);


        myVideoView = (VideoView)findViewById(R.id.myvideoview);
        myVideoView.setVideoPath(str);
        myVideoView.setMediaController(new MediaController(this));
        myVideoView.requestFocus();
        myVideoView.start();


        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                myVideoView.pause();                         
                setContentView(R.layout.pic);
            }                                   
        });

        btn1.setOnClickListener(new ButtonListener());


    } 
    catch (Exception e) {
        // handle any errors
        Log.e("HelloWorld", "1", e);  // log the error
        // Also let the user know something went wrong
        Toast.makeText(
                getApplicationContext(),
                e.getClass().getName() + " " + e.getMessage(),
                Toast.LENGTH_LONG).show();
    }
}

class ButtonListener implements View.OnClickListener{
    @Override
    public void onClick(View v) {

        setContentView(R.layout.main);
    }
}
}

En la linea btn1.setOnClickListener(new ButtonListener()); , logcat está diciendo java.lang.NullPointerException

¿Qué mal estoy haciendo?

preguntado el 12 de junio de 12 a las 22:06

¿Estás seguro de que hay un Button con id R.id.button1 at R.layout.main? -

Además, intente: if(myVideoView != null) myVideoView.pause(); o rodéalo con un intento/captura -

@K-ballo no, el botón 1 está en pic.xml -

@John Watson: Entonces, ¿cómo espera encontrar antes de que esté allí? Es setContentView(R.layout.pic) eso lo pone ahi... -

@K-ballo ¿Podría decirme lo siguiente? Si cambiamos el contenido usando setContentView ¿Destruye varios objetos y referencias creados en la vista de contenido anterior? -

2 Respuestas

Según lo que has escrito, When this button is clicked, content is set to pic.xml, which has two buttons, btn1 and btn2 su btn1 y btn2 están ubicados en R.layout.pic, pero estás tratando de encontrarlos en R.layout.main diseño por

btn1 = (Button) findViewById(R.id.button1);

btn2 = (Button) findViewById(R.id.button2);

Debe establecer valores para las variables btn1 y btn2 (y onClickListener, por supuesto, también) solo después de setContentView(R.layout.pic), porque solo entonces su diseño contendrá estos botones

Respondido el 12 de junio de 12 a las 22:06

Usar setContentView() más de una vez en una actividad es (¿casi?) siempre una mala, mala idea. Está eligiendo el botón con el ID de R.id.button1 de su main.xml diseño en su onCreate(), y establecer un oyente en ese botón. Cuando llames entonces setContentView(R.layout.pic) ese botón ya no es válido. tendrías que decir btn = (Button)findViewById(R.id.button1) de nuevo después de configurar la vista de contenido. Este es solo un mal diseño porque hay muchas oportunidades para que se rompa. Cualquier motivo por el que no pueda simplemente iniciar una nueva actividad con pic.xml como su vista de contenido al hacer clic en el botón?

Respondido el 12 de junio de 12 a las 22:06

en esta actividad estoy cargando un video desde sdcard. Si voy a otra actividad, tengo que volver y luego el video tiene que ser recargado, quería ahorrar esta vez. Además, en esta actividad se crea una imagen, que se muestra en pic.xml. Si creo una nueva actividad para pic.xml, ¿no cree que pasar el objeto de imagen consumirá mucho tiempo? - John Watson

¿Puedes sugerir algunas formas para no tener que volver a cargar el video? - John Watson

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.