2012-01-16 3 views
2

Просто отказ от ответственности, я очень новичок в Android и Java.Воспроизведение звукового файла при нажатии элемента списка

Конечный продукт, который я собираюсь после этого, представляет собой звукозаписывающее устройство, такое как приложение. Я хочу отобразить список звуков, которые пользователь может нажать, чтобы воспроизвести соответствующий звуковой файл.

До сих пор я установил пару строковых массивов в файле strings.xml. Один массив представляет доступные звуки, а второй массив представляет фактические ресурсы R.raw.soundfile. Может быть проще просто показать это.

<string-array name="alex_list"> 
    <item>Sound Title</item> 
</string-array> 

<string-array name="alex_sounds"> 
    <item>R.raw.soundfile</item> 
</string-array> 

Вот определение класса, которое у меня есть до сих пор. Я действительно не хочу, чтобы кто-нибудь «делал для меня работу», но я полностью потерял то место, где двигаться дальше. Мне кажется, что я должен передать позицию строкового массива из alex_list (при нажатии), чтобы получить нужный ресурс из alex_sounds (который должен играть сразу, не нуждается в средствах управления мультимедиа). Но вот где я застрял.

public class AlexList extends ListActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setListAdapter(ArrayAdapter.createFromResource(getApplicationContext(), R.array.alex_list, R.layout.list_item)); 

    getListView().setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 
      // I have zero clue what to do from here 
     } 

    }); 

} 
} 

Если есть лучший способ сделать это, сообщите мне. Последнее, что я хочу сделать, - это разработать вредные привычки на ранней стадии. Я продолжу работу над ним и отправлю обратно, если найду решение.

Заранее благодарим за ваше время!

ответ

3

Изменить ваши значения массива таким образом:

<string-array name="alex_sounds"> 
    <item>soundfile</item> 
</string-array> 

Тогда слушатель становится: (PACKAGENAME является строка, представляющая пакет файла R: например, "com.example.main")

@Override 
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 
    String selectedFromList = getItemAtPosition(pos); 
    int resId = getResources().getIdentifier(selectedFromList, "raw", packageName); 
    MediaPlayer mp = MediaPlayer.create(AlexList.this, resId); 
    mp.start(); 
} 

Это будет играть файл, имя которого вы выбрали в своем списке, из папки res/raw. (закодировано быстро в StackOverflow, могут быть синтаксические ошибки)

+0

Спасибо за быстрый ответ. Как бы я мог динамически вставить идентификатор ресурса, на основе которого был выбран элемент списка. Итак, для MediaPlayer.create (AlexLIst.this, <звуковой ресурс, который соответствует списку здесь>); Кроме того, есть ли лучший способ обойти это, кроме использования двух строковых массивов? –

+0

А, да, обновил мой ответ :) – Guillaume

+0

Хорошо, теперь мы куда-то попадаем! Я могу заставить его работать, пока элемент в списке alex_list соответствует имени файла mp3 в папке res/raw. Если бы я хотел, чтобы отображаемый текст отличался и все еще выполнял эту работу, как бы я это сделал? Например, отображаемый текст в списке может сказать «Добро пожаловать в рай», но файл находится на R.raw.paradise.mp3. Спасибо за вашу помощь, я рад, что нашел этот сайт. –

Смежные вопросы