如何在单击时查看Listview项目的特定声音

时间:2016-02-15 15:09:44

标签: java android listview audio

我正在创建一个带声音的Android词典应用程序...我有listview,当选择一个项目时,新活动打开,新活动内部包含4个textviews和一个图像按钮, textviews功能完美,但图像按钮不是。音频文件放在原始文件夹中。如何设置单击项目的特定声音? 这是代码:

MainActivityJava

public class MainActivity extends AppCompatActivity {

ListView lv;
SearchView sv;


String[] tagalog= new String[] {"alaala (png.)","araw (png.)","baliw (png.)","basura (png.)",
        "kaibigan (png.)","kakatuwa (pu.)", "kasunduan (png.)","dambuhala (png.)",
        "dulo (png.)","gawin (pd.)","guni-guni (png.)","hagdan (png.)","hintay (pd.)",
        "idlip (png.)","maganda (pu.)","masarap (pu.)", "matalino (pu.)"};

int[] sounds= new int[]{R.raw.alaala,
                R.raw.araw,
                R.raw.baliw,
                R.raw.basura,
                R.raw.kaibigan,
                R.raw.kakatuwa,
                R.raw.kasunduan,
                };


ArrayAdapter<String> adapter;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    lv = (ListView) findViewById(R.id.listView1);
    sv = (SearchView) findViewById(R.id.searchView1);

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,tagalog);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String tagword =tagalog[position];

            String[] definition = getResources().getStringArray(R.array.definition);
            final String definitionlabel = definition[position];

            String[] cuyuno = getResources().getStringArray(R.array.cuyuno);
            final String cuyunodefinition = cuyuno[position];

            String[] english = getResources().getStringArray(R.array.english);
            final String englishdefinition = english[position];


            Intent intent = new Intent(getApplicationContext(), DefinitionActivity.class);
            intent.putExtra("tagword", tagword);
            intent.putExtra("definitionlabel", definitionlabel);
            intent.putExtra("cuyunodefinition",cuyunodefinition);
            intent.putExtra("englishdefinition", englishdefinition);



            startActivity(intent);

        }
    });


    sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String text) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String text) {

            adapter.getFilter().filter(text);
            return false;
        }



    });

}

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    return super.onCreateOptionsMenu(menu);
}

}

DefinitionActivity.java

public class DefinitionActivity extends AppCompatActivity {

MediaPlayer mp;

String tagalogword;
String worddefinition;
String cuyunoword;
String englishword;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_definition);

    TextView wordtv = (TextView) findViewById(R.id.wordtv);
    TextView definitiontv = (TextView) findViewById(R.id.definitiontv);
    TextView cuyunotv = (TextView) findViewById(R.id.cuyunotv);
    TextView englishtv = (TextView) findViewById(R.id.englishtv);
    ImageButton playbtn = (ImageButton) findViewById(R.id.playbtn);


    final Bundle extras = getIntent().getExtras();

    if (extras != null) {

        tagalogword = extras.getString("tagword");
        wordtv.setText(tagalogword);

        worddefinition = extras.getString("definitionlabel");
        definitiontv.setText(worddefinition);

        cuyunoword = extras.getString("cuyunodefinition");
        cuyunotv.setText(cuyunoword);

        englishword = extras.getString("englishdefinition");
        englishtv.setText(englishword);

    }

    playbtn.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {

        }
    });


}

2 个答案:

答案 0 :(得分:0)

你可以在intent extra中传递原始id并在meadiaPlayer上播放

答案 1 :(得分:0)

你想要完成的事情非常简单。

你可以通过id。

但我为您的案例创建了此方法,您可以将其粘贴到您的活动或类中并对其进行调用。在我的例子中,我把这个方法放在一个包含所有常用函数,方法,字符串等的类中。选择是你的:

public static void playDisSound(Context c, int soundID){
                //Play short tune
                MediaPlayer mediaPlayer = MediaPlayer.create(c, soundID);
                mediaPlayer.setOnCompletionListener( new OnCompletionListener(){
                    @Override
                    public void onCompletion( MediaPlayer mp){
                        mp.release();
                    }
                });
                mediaPlayer.start();
            }

这就是如何在你的情况下使用它:

示例我想播放音频曲目:

int[] sounds= new int[]{R.raw.alaala,
                R.raw.araw,
                R.raw.baliw,
                R.raw.basura,
                R.raw.kaibigan,
                R.raw.kakatuwa,
                R.raw.kasunduan,
                };

所以我只是这样做:

//TODO ~ pls. remember to define context inside "onCreate" as 

//call this before "onCreate"
Context context;

//And do this inside "onCreate"   :
context = getApplicationContext();
OR
context = MainActivity.this;

//然后是解决方案,只需使用id调用playDisSound方法,在这种情况下,&#34;发声[postion_referencer_i]&#34;

playDisSound(context, sounds[postion_referencer_i]);

//现在关于你的&#34; position_referencer_i&#34;会....也取决于你打算如何传递id。

您是否要在拾取的位置和声音的位置之间进行匹配。这取决于你。但是我会创建一组整数来表示我想要玩哪个尝试,并在单击的项目所选位置之间进行匹配的简单计算以获得position_referencer_id。

//但是简单地说:如果我想玩你的阵列,请注意&#34; R.raw.baliw&#34;我只想打电话:

playDisSound(context, R.raw.baliw);

我希望这对你有用。所以,如果我详细阐述。如果您需要流式传输声音,请告诉我,这样我就可以粘贴/发送一个非常酷的方法,我一直在使用的应用程序中使用。

//最终PLS。请记住:这种方法可以播放声音,但是如果重复这个过程,它会毫不犹豫地再次播放声音。因此,请记住在允许用户重复之前检查声音是否播放和完成,否则可能导致重复或类似的两个扬声器播放同一首歌但在不同的时间播放。 (并且用户可能会开始认为应用程序存在问题。请使用此方法非常合乎逻辑且敏感。)

在解决这个问题时,您可以通过监听音轨的持续时间来禁用启动声音播放的按钮或UI元素,直到声音播放完毕(我相信您应该知道并灌输到您的逻辑或通过简单地听声音是否已经播放了)

一切顺利。时代。 :)