如何动态引用XML id来播放声音

时间:2014-12-10 08:10:13

标签: java android xml

我正在尝试制作一个音板,这样当你按下一个具有特定android:id的按钮时,它将播放一个同名的.ogg文件。我有布局设置,只需要帮助引用XML id。

例如,如果我有这个特定的按钮设置

<Button
            android:id="@+id/file022"
            android:layout_weight="1"
            android:layout_margin="1dp"
            android:layout_height="fill_parent"
            android:layout_width="fill_parent"
            android:text="Sample Text"
            android:textColor="#000000"
            android:textStyle="normal"
            android:onClick="playSound"
            android:background="#B3EDEDED"/>

我可以使用以下代码播放相应的声音来播放file022.ogg

(v.getId()==R.id.button14){
        MediaPlayer mpSound = MediaPlayer.create(this, R.raw.file022);
        mpSound.start();

我需要更改什么才能避免为'R.raw.file001','R.raw.file002'编写案例语句的硬编码,而是动态引用XML中设置的id?

2 个答案:

答案 0 :(得分:0)

您应该使用tag属性来执行此操作,因为检索ID的字段名称需要反射。

<Button
    ...
    android:tag="file022"
    ... />

然后,在您的代码中,您只需检索标记,并获取该名称的原始资源标识符。

String tag = (String) v.getTag();
int resId = getResources().getIdentifier(tag, "raw", getPackageName());
MediaPlayer mpSound = MediaPlayer.create(this, resId);
mpSound.start();

答案 1 :(得分:0)

对于您的按钮,您可以为其指定tag以识别要播放的声音资源

<Button
    android:id="@+id/file022" 
    ... contents skipped for brevity
    android:tag="file022" <--- add a tag which maps to your sound resource name
    />

然后为View.OnClickListener(或Activity)中的按钮分配Fragment

对于onClick(View)的实施,你可以做类似的事情:

public void onClick(View v){
    int soundResourceId = [yourContextObject].getResources().getIdentifier(v.getTag(), "raw", this.getPackageName());
    // play the sound
    MediaPlayer mpSound = MediaPlayer.create(this, soundResourceId );
    // etc...
}

注意:这假定标记已设置且OnClickListener仅分配给播放声音的按钮。此外,我使用了占位符[yourContextObject],因此您可以使用YourActivity.thisFragment getContext(),以便您可以访问应用资源

如果您更改资源名称,这可能会有点繁琐,因为您必须更改视图中android:tag属性的值。

感谢此StackOverflow线程进行字符串到资源的转换:Android: Howto get a resource id of an android resource

注意:Resources.getResource(...)可能有点慢,相反,您可以将R文件资源引用存储在类中的静态最终数组中,并通过存储索引而不是存储索引来创建数组和按钮之间的映射文件名在android:tag中,只需使用:int soundResourceId = yourResourceArray[Integer.parseInt(v.getTag())]即可获取数组的索引

编辑:如果你想坚持使用tag ==文件名,另一种选择是使用这样的东西: Android, getting resource ID from string?