2013-08-20 29 views
1

我爲我的android應用程序使用SoundPool。我加載約75一到三個第二聲音入池在我的主要活動,然後從使用Sound方法,它看起來像這樣的其他活動引用它們:在SoundPool中使用字符串play

public void Sound(int s){ 
    AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
    float volume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    MainActivity.spool.play(s, volume, volume, 1, 0, 1f); 
}; 

s的我在MainActivity定義整數類,例如:

static int sound_e; 

然後通入聲音的方法是這樣的:

Sound(sound_e); 

我想能夠定義像這樣的字符串:

String letter_sound = "MainActivity.sound_" + currentLetter; 
//Example value of this string would be MainActivity.sound_a 

然後將該字符串作爲整數傳遞給Sound。這是爲了避免26 if語句,這我做了這樣的數字:

if (randomNum == 1) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_1);} 
     else if (randomNum == 2) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_2);} 
     else if (randomNum == 3) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_3);} 
     else if (randomNum == 4) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_4);} 
     else if (randomNum == 5) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_5);} 
     else if (randomNum == 6) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_6);} 
     else if (randomNum == 7) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_7);} 
     else if (randomNum == 8) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_8);} 
     else if (randomNum == 9) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_9);} 
     else if (randomNum == 10) {Log.v(TAG, "Sound playing for: " + randomNum); Sound(MainActivity.sound_10);} 
     else Log.v(TAG, "None of the ifs are true. randomNum: " + randomNum); 

,我沒有對Android的文檔中看到任何的方式來傳遞字符串值入的Soundpool發揮,只是整數。謝謝你幫我弄清楚我錯過了什麼!

+0

要做到你想要的東西,我認爲你需要反思,但我也認爲還有其他方法可以做到這一點(常規方法調用?)。我現在可以說的是,你可以交換其他的東西 - 如果是用於switch-case語句,並且不需要重複'Log.v'語句 – keyser

+0

else-ifs在用於不同語音選擇的switch語句中。我不確定嵌套switch語句。 –

+0

你可以簡單地把它放在一個單獨的方法。 – keyser

回答

1

我爲我的Android應用程序使用SoundPool。我在我的主要活動中將大約75個1到3秒的聲音加載到游泳池中,然後使用聲音方法將其從其他活動中引用...

首先...不要這樣做。 Android Activity類不僅僅是一個普通的Java類,適當的(和安全的)Android編程方法是應該是自包含的。其他Activities或應用程序組件不應該有權訪問public方法或數據字段。

如果你不想提供一個通用類供多個應用程序組件使用,那麼只需創建一個'助手'POJO類。如果需要使用Context(例如SoundPool),則可以簡單地將Activity上下文傳遞到方法this。請注意保持對ActivityContext的引用,但它可能導致內存泄漏。

其次給一個簡單的答案,您的問題...

SoundPool回報soundID這是你用什麼來調用play(...)load(...)方法。如果您只想播放隨機聲音,那麼只需創建一些排序數組,然後使用隨機數字按索引從數組中獲取soundID。簡單 - 只需一行代碼即可訪問相關的soundID

+0

偉大,偉大,偉大的答案!謝謝!非常有用的有關自包含活動的信息以避免內存泄漏。謝謝! –

+1

我添加了一個配置類,現在我可以用這樣一行來調用我所有的聲音:'Config.Sound(Config。alphabetSoundsArray_voice1 [currentIndex],Game2Show.this);'你真棒! –

+0

很高興能有所幫助。 :) – Squonk

相關問題