2010-10-11 10 views
5

He creado una clase personalizada para mi proyecto de Android llamada "Sonidos". Quiero poder llamarla desde mi actividad. El contenido de mi clase son los siguientes:¿Importar mi clase personalizada y llamar a su método?

package com.mypackage; 

import java.util.HashMap; 

import android.content.Context; 
import android.media.SoundPool; 

public class Sounds { 

private static boolean sound = true; 

private static final int FLIP_SOUND = 1; 

private static Context context; 
private static SoundPool soundPool; 
private static HashMap<Integer, Integer> soundPoolMap; 

public static void initSounds() { 
    soundPoolMap.put(FLIP_SOUND, soundPool.load(context, R.raw.flip, 1)); 
} 

public static void playFlip() { 
     soundPool.play(soundPoolMap.get(FLIP_SOUND), 1, 1, 1, 0, 1); 
} 

public static void setSound(Boolean onOff) { 
    sound = onOff; 
} 
} 

En mi clase principal Actividad He intentado importar la clase, la creación de una instancia de ella, pero supongo que no estoy entender cómo se hace. ¿Alguien puede señalarme en la dirección correcta, por favor?

+0

Mi cómo las cosas cambian en unos pocos años. Parece que esta pregunta todavía es popular y que la gente está teniendo problemas similares, nuevos desarrolladores de Android, como me imaginaba en ese momento. Estoy viendo esto preguntándome cómo esperaba que funcionara. Lo obvio en el código anterior es que el contexto nunca se inicializa (como tampoco lo hacen ninguno de los campos), la clase requiere un constructor (y campos no estáticos) o los parámetros necesarios (como el contexto, el grupo de sonidos y soundPoolMap) que ves aquí pasó directamente a los métodos estáticos. De lo contrario, siempre serán nulos. – Hamid

Respuesta

9

Editado: De la clase Activity:

private Sounds s; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
     s = new Sounds(this); 
     s.initSounds(); 
} 

También puede enviar el contexto con el constructor de la clase personalizada.

Retire las variables y métodos estáticos:

public class Sounds { 

private boolean sound = true; 

private int FLIP_SOUND = 1; 

private Context context; 
private SoundPool soundPool; 
private HashMap soundPoolMap; 

public Sounds(Context context){ 
    this.context = context; 
    soundPoolMap = new HashMap(); 
    soundPool = new SoundPool(0, AudioManager.STREAM_MUSIC, 0); 
} 

public void initSounds() { 
    soundPoolMap.put(FLIP_SOUND, soundPool.load(context, R.raw.flip, 1)); 
} 

public void playFlip() { 
    soundPool.play(soundPoolMap.get(FLIP_SOUND), 1, 1, 1, 0, 1); 
} 

public void setSound(Boolean onOff) { 
    sound = onOff; 
} 
} 
+0

He intentado todo lo especificado aquí con mi último recurso siendo la causa "estática", después de la sugerencia arriba, los eliminé donde se indicaban y el programa aún se cierra en cuanto la actividad intenta llamar a los sonidos en línea() ; Asumo que el problema es el contexto, ya que me dio problemas antes. ¿Puedes sugerirme cómo debería pasar el contexto correctamente? – Hamid

+0

@Hamid: He editado mi respuesta. – Wroclai

+0

Gracias, he hecho esto pero el programa aún se cierra cuando llamo a initSounds(); Si comento esto, funciona bien. No estoy seguro si es relevante, pero la actividad en la que estoy trabajando se llama desde una actividad anterior (¿parental?) Por un intento ... – Hamid

1

Trate

Sounds s = new Sounds(); 
s.initSounds(); 
s.playFlip(); 
s.setSound(true); 
1

que haya realizado todos los métodos de la clase estática. Si desea utilizarlos tal como están, llámelos con Sounds.initSound() y así sucesivamente. Sin embargo, dado que tiene variables de clase, los métodos estáticos y las variables no parecen apropiados. Elimine static de sus miembros (excepto desde FLIP_SOUND) y luego intente crear una instancia de la clase y métodos de llamada como normal.

2

También tengo problemas en este peculiar uso de las clases. Soy un novato en Android e incluso en el uso de clases y estoy estudiando la WebInterface.

La solución de Shane Oliver funcionó para mí usando las variables de clase estándar.

En la clase Actividad:

Private JavaScriptInterface myJavaScriptInterface; 
myJavaScriptInterface.Toastshow("Hi EveryOne"); 

o incluso:

JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this); 

En cuanto a la clase JavaScriptInterface:

public class JavaScriptInterface { 

    Context myContext; 

    //Instanciar o interface e definir o conteudo 
    JavaScriptInterface(Context c) { 
     myContext = c; 
    } 


    public void Toastshow(String toast_msg) 
    { 


     Toast.makeText(myContext, toast_msg, Toast.LENGTH_LONG).show(); 
    } 
} 

Espero que esto ayude ...

Cuestiones relacionadas