2013-08-20 1 views
1

Я использую SoundPool для своего приложения для Android. Я загружаю около 75 одного до трех вторых звуков в бассейн в моей основной деятельности, а затем ссылаться на них от других видов деятельности с использованием метода Sound, который выглядит следующим образом:Используйте String в 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 

И затем передать эту строку в Звук как целое число. Это позволяет избежать 26, если заявления, которые я сделал для чисел, как это:

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

я не видело в андроиде документации какого-либо способ передать значение строки в Soundpool игру, только целые числа. Спасибо, что помогли мне разобраться в том, что мне не хватает!

+0

Чтобы сделать то, что вы хотите, я думаю, вам нужно отражение, но я также думаю, что есть другие способы сделать это (обычный вызов метода?). Все, что я могу сказать до сих пор, это то, что вы можете поменять местами другие: if для оператора switch-case, и нет необходимости повторять этот оператор 'Log.v' – keyser

+0

. Else-ifs находятся в операторах switch для разных вариантов голоса. Я не был уверен в том, что вы вставляете инструкции switch. –

+0

Вы можете просто поместить его в отдельный метод. – keyser

ответ

1

Я использую SoundPool для своего приложения для Android. Я загружаю около 75 одно- и трехсекундных звуков в пул в своей основной деятельности, а затем ссылаюсь на их другие действия с использованием метода звука ...

Во-первых ... НЕ ДЕЛАЙТЕ ЭТО. Класс Android Activity - это не просто обычный Java-класс, а правильный (и безопасный) подход к программированию на Android - это то, что Activity должен быть автономным. Другие Activities или компоненты приложения не должны иметь доступ к методам или полям данных public.

Если вы не хотите использовать общий класс для использования несколькими компонентами приложения, просто создайте класс «помощник» POJO. Если ему нужно использовать Context (например, SoundPool), вы можете просто передать контекст Activity в методы как this. Соблюдайте осторожность при сохранении ссылки на ActivityContext, так как это может вызвать утечку памяти.

Во-вторых, чтобы дать простой ответ на вашу проблему ...

В load(...) методы SoundPool возвратной soundID который является то, что вы используете для вызова метода play(...). Если все, что вы хотите сделать, это сыграть случайный звук, тогда просто создайте массив какого-то типа и используйте случайное число, чтобы получить soundID из массива по индексу. Простой - только одна строка кода для доступа к соответствующему soundID.

+0

Отличный, отличный, отличный ответ! Спасибо! Очень полезная информация о самодостаточных действиях, чтобы избежать утечек памяти. Благодаря! –

+1

Я добавил класс конфигурации, и теперь я могу вызвать все мои звуки с помощью одной строки: «Config.Sound (Config.alphabetSoundsArray_voice1 [currentIndex], Game2Show.this); 'вы потрясающие !! –

+0

Рад помочь. :) – Squonk