0

我正在制作一个 android 应用程序,我在其中找到了一些音乐的搜索栏。我得到了搜索栏来显示音乐播放状态,我目前在音乐播放中。但是我如何设置一个监听器,以便我可以说媒体播放器会在轨道上播放特定位置?我知道在 mediaplayer 中设置播放时间的代码,但是如何处理来自 seekbar 的点击事件?像 onClick() 或类似的东西?

固定:我的代码:

package com.mycompany.appname;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.app.ListActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.SlidingDrawer;

public class MusicActivity extends ListActivity implements OnClickListener, OnSeekBarChangeListener {
//Called when the activity is first created
List<String> myList = new ArrayList<String>();
EditText AddItemToListViewEditText;
  static final String[] COUNTRIES = new String[] {
      "Movies"
      };
  MediaPlayer mp1;
  String musicUri;
  Button PausePlay;
  int positionInt;
  SlidingDrawer slidingDrawer2;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.musicscreen);

    //Import views
    PausePlay = (Button)findViewById(R.id.PausePlay);
    slidingDrawer2 = (SlidingDrawer)findViewById(R.id.slidingDrawer2);

    //Setup onClickListener for the buttons
    PausePlay.setOnClickListener(this);

    //Setup mediaPlayer
    mp1 = new MediaPlayer();

    //Setup ListView
    setListAdapter((ListAdapter) new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES));
    setListAdapter((ListAdapter) new ArrayAdapter<String>(this, R.layout.list_item, myList));

    //Setup seekBar
    final SeekBar progress = (SeekBar)findViewById(R.id.musicProgressBar);
    progress.setOnSeekBarChangeListener(this);

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    File mFile = new File(Environment.getExternalStorageDirectory() + "/Music/");
    myList.addAll(Arrays.asList(mFile.list()));
    setListAdapter((ListAdapter) new ArrayAdapter<String>(this, R.layout.list_item, myList));

    lv.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent, View view,
          int position, long id) {
        //When an item is clicked, play it on a MediaPlayer
          //Play song
          positionInt = position;
          if (mp1.isPlaying()) {
              //Reset mediaPlayer
              mp1.reset();
              try {
                  musicUri = Environment.getExternalStorageDirectory() + "/Music/" + myList.get(positionInt);
                mp1.setDataSource(musicUri);
                mp1.prepare();
                mp1.start();
                slidingDrawer2.animateOpen();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          } else {
          try {
              musicUri = Environment.getExternalStorageDirectory() + "/Music/" + myList.get(position);
            mp1.setDataSource(musicUri);
            mp1.prepare();
            mp1.start();
            slidingDrawer2.animateOpen();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

          //Setup seekBar
          final SeekBar progress = (SeekBar)findViewById(R.id.musicProgressBar);
          progress.setProgress(0);
          progress.setMax(mp1.getDuration());
          new CountDownTimer(mp1.getDuration(), 250) {
            public void onTick(long millisUntilFinished) {
                if (progress.getProgress() == mp1.getDuration()) {
                    mp1.reset();
                    progress.setProgress(0);
                } else {
                  progress.setProgress(mp1.getCurrentPosition());
                }
            }
            public void onFinish() {}
          }.start();
        }
  }
    });
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    if (fromUser == true) {
        mp1.seekTo(seekBar.getProgress());
    } else {
        //Do nothing
    }
}

@Override
public boolean onKeyDown(int KeyCode, KeyEvent event) {
    if ((KeyCode == KeyEvent.KEYCODE_BACK)) {
        if (mp1.isPlaying()) {
            mp1.reset();
            System.exit(0);
        } else {
            finish();
        }
        return true;
    }
    return super.onKeyDown(KeyCode, event);
}

public void onClick(View src) {
    switch(src.getId()) {
    case R.id.PausePlay:
        if (mp1.isPlaying()) {
            mp1.pause();
            PausePlay.setText("Play");
        } else {
            mp1.start();
            PausePlay.setText("Pause");
        }
        break;
    }
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub
}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub
}
}

我的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >


<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Musikk"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >




    <ListView
        android:id="@+android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

    </ListView>


    <SlidingDrawer
        android:id="@+id/slidingDrawer2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:content="@+id/content"
        android:handle="@+id/handle" >


        <Button
            android:id="@+id/handle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Spiller nå" />


        <LinearLayout
            android:id="@+id/content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >


            <SeekBar
                android:id="@+id/musicProgressBar"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >













                <Button
                    android:id="@+id/PausePlay"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="Pause" />

            </LinearLayout>

        </LinearLayout>
    </SlidingDrawer>

</FrameLayout>

</LinearLayout>
4

2 回答 2

1

您需要实现SeekBar.OnSeekBarChangeListener,然后实现onProgressChanged方法。

这在进度发生变化时调用(例如,用户单击搜索栏上的某处),并将为您提供新位置。

例子:

public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser) {
    // Do something
}

不要忘记使用 seekBar.setOnseekBarChangeListener 注册 OnSeekBarChanged 监听

于 2012-07-07T15:52:04.763 回答
0
public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub
                if (fromUser) {
                    mp1.seekTo(progress);
                    seekBar.setProgress(progress);
                }

            }
于 2014-04-12T05:59:38.653 回答