PDA

Ver la Versión Completa : [ CONSULTA ] Problema con declaración de controles(botón)


normion
15/03/11, 00:48:56
Saludos, mi problema es que tengo un código que en teoría debería funcionar y de hecho compila, pero cuando lo ejecuto en el emulador me da un force close y se acabo. He ido quitando partes del código hasta que he dado con lo que falla y es con la declaración de los botones que creo en main.xml

El codigo completo es:

import android.app.Activity;
import android.widget.Button;
import android.os.Bundle;
import android.view.View;
import android.util.Log;
import android.media.MediaPlayer;

import java.io.IOException;

public class Reproductor extends Activity {


private static final String LOG_TAG = "AudioRecordTest";
private static String mFileName = null;

final Button btnStart = (Button)findViewById(R.id.btnStart);
final Button btnStop = (Button)findViewById(R.id.btnStop);
private MediaPlayer mPlayer = null;


/** Called when the activity is first created. */
override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btnStart.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0)
{
mFileName = "http://62.212.74.140:8206/listen.pls";
startPlaying();
}
});

btnStop.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0)
{
stopPlaying();
}
});


}
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
}

private void stopPlaying() {
mPlayer.release();
mPlayer = null;
}


}

Concretamente el "codigo maligno" es este:

final Button btnStart = (Button)findViewById(R.id.btnStart);
final Button btnStop = (Button)findViewById(R.id.btnStop);

Alguien sabe que puede estar fallando??? Me tiene loco...

mekawendie
15/03/11, 13:28:54
Puedes poner la parte del main.xml donde pintas los botones?

normion
15/03/11, 22:31:53
Si, por supuesto. Es este:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">

<Button android:id="@+id/btnStart"
android:text="Play"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button android:id="@+id/btnStop"
android:text="Stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />




</LinearLayout>

Muchas gracias por el interés!!

Duqe
15/03/11, 23:16:54
Te has fijado en el Logcat? Suele darte pistas de donde viene el error.

adk
16/03/11, 12:53:41
Tienes varios errores:
No puedes declarar como final un objeto que quieres modificar.
No puedes utilizar una llamada a un método cuando declaras una variable a nivel de instancia

Por lo que el código que tendría que funcionar es:

import android.app.Activity;
import android.widget.Button;
import android.os.Bundle;
import android.view.View;
import android.util.Log;
import android.media.MediaPlayer;

import java.io.IOException;


public class Reproductor extends Activity {


private static final String LOG_TAG = "AudioRecordTest";
private static String mFileName = null;

private Button btnStart ;
private Button btnStop;
private MediaPlayer mPlayer = null;


/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.prueba);

btnStart = (Button)findViewById(R.id.btnStart);
btnStop = (Button)findViewById(R.id.btnStop);

btnStart.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0)
{
mFileName = "http://62.212.74.140:8206/listen.pls";
startPlaying();
}
});

btnStop.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0)
{
stopPlaying();
}
});


}
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
}

private void stopPlaying() {
mPlayer.release();
mPlayer = null;
}


}

normion
16/03/11, 18:52:18
Adk, gracias. El problema era lo de declararlo antes de invocar a main a traves de R, lo de fianl esta bien. Me di cuenta anoche despues de probar mil veces y ahora funciona maravillosamente X-D Siento no haber actualizado mis avances antes.
Gracias a todos!!

mekawendie
16/03/11, 19:12:49
Exacto, debes crear la instancia del control en el OnCreate después de haber establecido el ContentView, en tu caso el main.

Si no, al llamar a findViewById te dará un nullpointerexception ya que no tiene un Content donde buscar y se vuelve to locooooo !!! :risitas:

Suerte con ese reproductor!

czuniga
01/04/11, 02:05:37
hola compañeros, les dejo un link d descarga , es un sistemita de android para la d2, despues de una pequeñas modificaciones, como quitar un programa y poner otro, funciono muy bien, quiza les sirva de algo, saludos.
http://www.4shared.com/dir/i7-s8TgE/androitopaswm6.html

pmaicas
01/04/11, 09:21:44
Tienes el código que inicializa las variables Button fuera del método onCreate, cuando todavía no se ha cargado el layout y por lo tanto findViewById devolverá null.

luisv69
26/04/11, 10:35:13
Hola, podeis poner el código? porque yo estaba con lo mismo y tenia problemas parecidos, solo que ahora no se me para, es decir, le doy al play y no va ya el stop ni nada me dice que no responde.
muchas gracias