Смена состояние Toggle Button и обновление Seekbar в Mediaplayer

204
28 апреля 2017, 17:56

Приветствую.

Я сделал selector

  <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false" android:drawable="@drawable/ic_action_play" />
<item android:state_checked="true" android:drawable="@drawable/ic_action_pause" />

Затем назначил его background-ом в togglebutton

   <ToggleButton
            android:id="@+id/play"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:textOn=""
            android:textOff=""
            android:text=""
            android:background="@drawable/play_pause"
            android:contentDescription="@string/play" />

Затем в своем activity прописал следующий код

public class HeadsActivity extends AppCompatActivity {
      MediaPlayer mediaPlayer;
      Handler handler;
      SeekBar seekBar;
      ToggleButton play, replay;
      int length = 0;
   @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_heads);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    handler = new Handler();
    play = (ToggleButton) findViewById(R.id.play);
    replay = (ToggleButton) findViewById(R.id.replay);
    seekBar = (SeekBar) findViewById(R.id.seek);
    mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.my_sound);
    length = mediaPlayer.getDuration();
    seekBar.setMax(length);
    handler.postDelayed(my_UpdateTimeTask, 100);
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
            if(mediaPlayer != null && input) {
                mediaPlayer.seekTo(progress);
            }
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    });
    play.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(play.isChecked()) {
                mediaPlayer.start();
            } else {
                mediaPlayer.pause();
            }
        }
    });
   replay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(replay.isChecked()) {
                mediaPlayer.setLooping(true);
            } else {
                mediaPlayer.setLooping(false);
            }
        }
    });
 }
   private Runnable my_UpdateTimeTask = new Runnable() {
    @Override
    public void run() {
        if(mediaPlayer.isPlaying()) {
            int my_CurrentPosition = mediaPlayer.getCurrentPosition();
            seekBar.setProgress(my_CurrentPosition);
        } try {
            handler.postDelayed(this, 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

Теперь, когда я воспроизожу аудио, togglebutton из состояния play, переключается в состояние pause и в этом все работает отлично, и также seekbar передвигается в соответствии с аудио файлом. Но проблема в том, что когда аудио заканчивается, togglebutton не переключает свое состояние, и остается во втором состоянии pause, и нужно нажать раз, только потом переключается в состояние play и нажав второй раз только тогда аудио воспроизводится вновь. Вопрос: Как мне по завершению аудио сменить состояние togglebutton и как скинуть на ноль состояние линии seekbar progress?

Answer 1

Добавьте к своему медиаплееру

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    //Метод вызывается, когда трек заканчивается
    public void onCompletion(MediaPlayer mp) {
        //TODO : переключение состояния кнопки
    }
});

подробнее почитайте в документации

READ ALSO
Error:Cause: unable to find valid certification path to requested target

Error:Cause: unable to find valid certification path to requested target

Добрый день, возникла проблема при клонировании проекта с GitHub, все сделал по инструкциямМожет ли кто объяснить в что я сделал не так? Версия...

265
Добавление новой строки в JTable по кнопке (Java) (Swing)

Добавление новой строки в JTable по кнопке (Java) (Swing)

Да,вопрос от новичкаНе нужно издеваться

491
Ошибка при компиляции проекта

Ошибка при компиляции проекта

Здравствуйте помогите исправить ошибку

276