Duda android

charl1

Buenas,

Os pongo en situación, al clicar en boton entro en una actividad que lista unas canciones, la cual es generada dinamicamente y voy insertando botones por cada valor del string_array.

public void listaMusica() {
        // Get element father
        LinearLayout ll = (LinearLayout) findViewById(R.id.ll_musica);
        // Get resources
        Resources res = getResources();
        String[] listaMusica = res.getStringArray(R.array.lista_musica);
        // Dynamic Textview
        int count = new Integer(0);
        for (String value : listaMusica) {
            Button btt = new Button(this);
            btt.setText(value);
            btt.setId(count);
            ll.addView(btt);
            count++;
        }
    }

Hasta aquí todo bien, pero quiero detectar cuando clico a un boton y a que boton.
A que boton entiendo que he de encontrar el id que le asigno, pero para llamar a una funcion cuando hago clico en cualquier boton ? Llamar a una funcion o cualquier cosa, el caso es saber cuando clico a cualquier boton.

He probado con :

Button.OnClickListener handler = new View.OnClickListener() {
        int id = new Integer(0);
        @Override
        public void onClick(View v) {
            id = v.getId();
        }
    };

Pero debugando no me lo hace cuando clico.. sino secuencialmente, lo meto en una funcion? o como hago.

Gracias!

charl1

Lo acabo de solucionar temporalmente, aunque no me gusta la solución que he aplicado, seguiré investigando..

for (String value : listaMusica) {
            Button btt = new Button(this);
            btt.setText(value);
            btt.setId(count);
            btt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    switch (v.getId()){
                        case 0:
                            MediaPlayer mPlayer = MediaPlayer.create(MusicaActivity.this, R.raw.calentamiento);
                            mPlayer.start();
                    }
                }
            });
            ll.addView(btt);
            count++;
        }

La intención es acabar usando el player del dispositivo.
Cualquier ayuda para reorientar será bienvenida.. :D

forlayo

Una forma de hacerlo sería la siguiente:

  • A la vista del botón le pones en el tag el id de la cancion que quieras reproducir. v.setTag(R.raw.calentamiento);
  • A todos los botones le pones el mismo evento para manejar el click.
  • Dentro del evento, recuperas el tag y en funcion de este reproduces. ( int cancionId = v.getTag() );

Aunque a lo mejor es mas interesante montar todo esto con un listview directamente.

Un saludo.

1 respuesta
MTX_Anubis

Lo suyo es usar un SoundPool con las canciones que quieras aunque hay que tener cuidado porque carga las canciones en memoria cuando haces los load, si van a ser listas largas tienes que gestionarlo de otra manera (claro que tampoco deberían estar en el apk y lo suyo sería guardarlas en la sd y cargar la carpeta mediante uris llamando a sus release() y start() correspondientes cuando toque).

El api

http://developer.android.com/reference/android/media/SoundPool.html

No lo he usado así que quizá tengas que hacer algún cambio :P

// Creamos el pool con el número de canciones
pool = new SoundPool(listaMusica.length, AudioManager.STREAM_MUSIC, 0);

// nuestro listener
listener = new View.OnClickListener() {
  @Override
    public void onClick(View v) {
      pool.play((int)v.getTag(), 1.0f, 1.0f, 1, 0, 1.0f);
    }
  }
};

// En la creación de la lista, creamos los botones
// Aquí doy por hecho de que tienes una lista de id de canciones que corresponde con el array de títulos tal que así
// int[] listaIdsCanciones = {R.raw.cancion1,R.raw.cancion2...};
int count = 0;
for (String titulo : listaMusica) {
  button = new Button(this);
  // Tu código de configuracion del botton
  // ...
  button.setTag(pool.load(this,listaIdsCanciones[count],1));
  btt.setOnClickListener(listener);
  count++;
}
1 respuesta
charl1

Gracias #3 y #4.

#4 Le echaré un vistazo aunque tenía entendido que mediplayer era para canciones y soundpool para reproducciones mas cortas.

PD: Tampoco he usado soundpool.