2010-10-11 22 views
5

Ho creato una classe personalizzata per il mio progetto Android chiamato "Suoni". Voglio essere in grado di chiamarlo dalla mia attività. Il contenuto della mia classe sono i seguenti:Importare la mia classe personalizzata e chiamarla come metodo?

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; 
} 
} 

Nella mia classe di attività principale Ho provato ad importare la classe, la creazione di un'istanza di esso, ma mi sa che non sto solo capire come si fa. Qualcuno può indicarmi la direzione giusta per favore?

+0

mio modo le cose cambiano in pochi anni. Sembra che questa domanda sia ancora popolare e che le persone abbiano problemi simili, i nuovi sviluppatori Android che immagino, proprio come lo ero io all'epoca. Sto guardando questo chiedendomi come mai mi sarei aspettato che funzionasse. La cosa ovvia nel codice sopra è che il contesto non è mai stato inizializzato (né alcuno dei campi hte in effetti), la classe richiede o un costruttore (e campi non statici), o i parametri necessari (come il contesto, il soundpool e soundPoolMap) che vedi qui passato direttamente ai metodi statici. Altrimenti, saranno sempre nulli. – Hamid

risposta

9

Modificato: dalla classe Activity:

private Sounds s; 

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

si potrebbe anche inviare il contesto con il costruttore per la classe personalizzata.

Rimuovere le variabili e metodi statici:

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

Ho provato tutto qui specificato con il mio ultimo ricorso essendo la causa "statica", dopo il suggerimento in alto li ho rimossi dove detto e il programma continua a forzare non appena l'attività tenta di chiamare s.initSounds() ; Suppongo che il problema sia il contesto, in quanto mi ha dato problemi prima. Puoi suggerire come dovrei passare il contesto correttamente? – Hamid

+0

@Hamid: ho modificato la mia risposta. – Wroclai

+0

Grazie, ho fatto questo, ma il programma continua a forzare quando chiamo initSounds(); Se commento questo funziona bene. Non sono sicuro se è rilevante, ma l'attività in cui lavoro è chiamata da un'attività precedente (genitore?) Da un intento ... – Hamid

1

Prova

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

aver effettuato tutti i metodi della classe statica. Se si desidera utilizzarli così com'è, chiamarli con Sounds.initSound() e così via. Tuttavia, poiché si dispone di variabili di classe, i metodi statici e le variabili non sembrano appropriati. Rimuovi static dai tuoi membri (eccetto da FLIP_SOUND) e prova a creare un'istanza della classe e metodi di chiamata come normali.

2

Ho anche problemi su questo particolare utilizzo delle classi. Sono un principiante in Android e anche nell'uso delle classi e sto studiando la WebInterface.

La soluzione di Shane Oliver ha funzionato per me utilizzando le variabili di classe standard.

Nella classe di attività:

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

o anche:

JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this); 

Per quanto riguarda il JavaScriptInterface classe:

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(); 
    } 
} 

Spero che questo aiuti ...

Problemi correlati