2016-10-16 5 views
1

Я работаю над приложением, которое в основном представляет собой музыкальную библиотеку, и для каждой песни при нажатии кнопки воспроизведение начинается. На данный момент моя библиотека имеет 3 элемента, и я пытаюсь воспроизвести «sound.mp3», который находится в res/raw, для 3 из них (на данный момент).Ошибка в mediaPlayer.create (это, R.raw.sound), когда не в onCreate

Моя проблема в том, когда я пытаюсь ссылаться на клип, у меня есть красное подчеркивание под «this, R.raw.sound». Я видел, что в большинстве случаев «create» вызывается в onCreate, но в моем случае этот класс не работает, поэтому я не могу этого сделать ...

Можете ли вы, ребята, помочь мне с этим? :)

public class ClipsAdapter extends RecyclerView.Adapter<ClipsAdapter.MyViewHolder> { 

private final List<Clips> clip2 = Arrays.asList(
     new Clips("Clip 1", "Artist 1"), 
     new Clips("Clip 2", "Artist 2"), 
     new Clips("Clip 3", "Artist 3") 
); 

public class MyViewHolder extends RecyclerView.ViewHolder { 

    private final TextView title; 
    private final TextView author; 
    private final ImageView play; 

    private Clips currentClip; 
    MediaPlayer mediaPlayer = new MediaPlayer(); 

    public MyViewHolder(final View itemView) { 
     super(itemView); 

     title = ((TextView) itemView.findViewById(R.id.title)); 
     author = ((TextView) itemView.findViewById(R.id.author)); 
     play = ((ImageView) itemView.findViewById(R.id.play)); 
    } 

    public void display(RandomClips RandomClip) { 
     currentRandomClip = RandomClip; 
     title.setText(RandomClip.title); 
     author.setText(RandomClip.author); 
     play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "Play clip: " + currentClip.title); 
       mediaPlayer.create(this, R.raw.sound); 

       if (mediaPlayer.isPlaying()) 
       { 
        mediaPlayer.stop(); 
        mediaPlayer.reset(); 
        Log.d(TAG, currentRandomClip.title + " has stopped"); 
       } 
       else 
       { 
        mediaPlayer.start(); 
        Log.d(TAG, currentRandomClip.title + " is playing"); 
       } 
      } 
     }); 
    } 
} 

}

ответ

0

mediaPlayer.create() запрашивает для контекста, а файл для воспроизведения. «Это» вы передаете как аргумент не Контекст (вы в анонимном классе), и поэтому вы получаете сообщение об ошибке.
Вы должны передать контекст. Просто передайте контекст своей деятельности при создании экземпляра ClipsAdapter.

Так что в вашей деятельности экземпляр адаптера:

clipsAdapter = new ClipsAdapter(this); 

В классе ClipsAdapter, создать конструктор с одним параметром:

public ClipsAdapter(YourActivity activity) { 
    this.activity = activity; 
} 

Наконец:

mediaPlayer.create(activity, R.raw.sound); 
+0

Привет Анто! Спасибо за вашу помощь, я смог играть в свою программу без ошибок :) Итак, если я хорошо понимаю, мы используем конструктор для установки текущей активности как активности, в которой будет воспроизводиться звуковой клип. И это необходимо, потому что нам нужна операция для запуска клипа. – Yoan

+0

Я предполагаю, что он работает сейчас, хотя я думаю, что с эмулятором мы не можем играть на самом деле ... Я прав? – Yoan

+0

Рад слышать. вы должны иметь возможность воспроизводить звук с помощью эмулятора. Тогда это другой вопрос. Проверьте, помогает ли это http://stackoverflow.com/questions/5259849/mediaplayer-no-longer-working-on-the-emulator-since-r10/8262747#8262747 – HelloSadness