2012-01-16 50 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

感谢您的快速回复。我将如何去动态插入基于哪个列表项被点击的资源ID。因此对于MediaPlayer.create(AlexLIst.this,<对应于列表的声音资源>);另外,有没有更好的方式去使用两个字符串数组? – 2012-01-16 12:33:53

+0

啊,是的,更新了我的回应:) – Guillaume 2012-01-16 12:35:02

+0

好吧,现在我们正在某个地方!只要alex_list中的项目与res/raw文件夹中的mp3文件名相匹配,我就可以使其工作。如果我希望显示的文字有所不同并且仍然有这项工作,我该如何解决这个问题?例如,列表中的显示文本可能会显示“Welcome to paradise”,但该文件位于R.raw.paradise.mp3。感谢您的帮助,我很高兴我找到了这个网站。 – 2012-01-16 12:52:32