2015-10-07 211 views
0

我正在制作音乐播放器应用程序。对于SongsList(SongList.java)和Mediaplayer控件(即包含播放,暂停按钮的Mediaplayer.java),我有两个不同的片段。现在,我想将我的SongsList.java与Mediaplayer.java连接起来。我想从SongsList.java中选择一首在Mediaplayer.java中播放的歌曲。我该怎么做 ?请帮忙 !!!Android音乐播放器

SongList.java

import android.app.Fragment; 
import android.content.ContentResolver; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 

public class Songlist extends Fragment { 
private ArrayList<Song> songList; 
private ListView songView; 


@Override 
public View onCreateView(LayoutInflater inflater, 
        ViewGroup container, Bundle savedInstanceState) { 

//Inflate the layout for this fragment 
View view=inflater.inflate(
     R.layout.songs, container, false); 
songView = (ListView)view.findViewById(R.id.song_list); 

songList = new ArrayList<Song>(); 
getSongList(); 
Collections.sort(songList, new Comparator<Song>() { 
    public int compare(Song a, Song b) { 
     return a.getTitle().compareTo(b.getTitle()); 
    } 
}); 
SongAdapter songAdt = new SongAdapter(getActivity(), songList); 
songView.setAdapter(songAdt); 

songView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      ///////////////////WHAT TO DO HERE!////////////////// 
     } 
    }); 

return view; 
} 

public void getSongList() { 
//retrieve song info 
ContentResolver musicResolver = getActivity().getContentResolver(); 
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); 
if(musicCursor!=null && musicCursor.moveToFirst()){ 
    //get columns 
    int titleColumn = musicCursor.getColumnIndex 
      (android.provider.MediaStore.Audio.Media.TITLE); 
    int idColumn = musicCursor.getColumnIndex 
      (android.provider.MediaStore.Audio.Media._ID); 
    int artistColumn = musicCursor.getColumnIndex 
      (android.provider.MediaStore.Audio.Media.ARTIST); 
    //add songs to list 
    do { 
     long thisId = musicCursor.getLong(idColumn); 
     String thisTitle = musicCursor.getString(titleColumn); 
     String thisArtist = musicCursor.getString(artistColumn); 
     songList.add(new Song(thisId, thisTitle, thisArtist)); 
    } 
    while (musicCursor.moveToNext()); 
} 
} 
} 

MediaPlayer.java(尚未实现某些按钮)

import android.app.Fragment; 
import android.graphics.drawable.Drawable; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageButton; 
import android.widget.SeekBar; 
import android.widget.TextView; 

import java.util.concurrent.TimeUnit; 


public class Mediaplayer extends Fragment{ 

Drawable shuffle1,back1,play1,next1,repeat1; 

ImageButton shuffle,back,play,next,repeat; 
TextView start,end,artist,song; 
SeekBar songprogress; 
private MediaPlayer mediaPlayer; 
private double startTime = 0; 
private double finalTime = 0; 
private Handler myHandler = new Handler();; 



    @Override 
    public View onCreateView(LayoutInflater inflater, 
        ViewGroup container, Bundle savedInstanceState) { 

//Inflate the layout for this fragment 
View view=inflater.inflate(
     R.layout.content_main, container, false); 
start=(TextView)view.findViewById(R.id.songCurrentDurationLabel); 
end=(TextView)view.findViewById(R.id.songTotalDurationLabel); 
song=(TextView)view.findViewById(R.id.song_title); 
artist=(TextView)view.findViewById(R.id.songArtist); 


shuffle=(ImageButton)view.findViewById(R.id.shuffle); 
back=(ImageButton)view.findViewById(R.id.back); 
play=(ImageButton)view.findViewById(R.id.play); 
next=(ImageButton)view.findViewById(R.id.next); 
repeat=(ImageButton)view.findViewById(R.id.repeat); 
songprogress = (SeekBar) view.findViewById(R.id.songProgressBar); 

    mediaPlayer = MediaPlayer.create(getActivity(),R.raw.song); 
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener()  { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
    play1 = 
     getResources().getDrawable(R.drawable.play); 
    play.setImageDrawable(play1); 

    songprogress.setProgress(0); 

    } 
    }); 
    play.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     songprogress.setClickable(true); 

     if(!mediaPlayer.isPlaying()) { 

      mediaPlayer.start(); 
      finalTime = mediaPlayer.getDuration(); 
      startTime = mediaPlayer.getCurrentPosition(); 

      play1 = 
        getResources().getDrawable(R.drawable.pause); 
      play.setImageDrawable(play1); 


      songprogress.setMax((int) finalTime); 

      end.setText(String.format("%d.%d", 
          TimeUnit.MILLISECONDS.toMinutes((long) finalTime), 
          TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - 
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) 
      ); 

      start.setText(String.format("%d.%d", 
          TimeUnit.MILLISECONDS.toMinutes((long) startTime), 
          TimeUnit.MILLISECONDS.toSeconds((long) startTime) - 
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) 
      ); 

      songprogress.setProgress((int) startTime); 
      myHandler.postDelayed(UpdateSongTime, 100); 



     }else{ 
      mediaPlayer.pause(); 
      play1 = 
        getResources().getDrawable(R.drawable.play); 
      play.setImageDrawable(play1); 
     } 
    } 
    }); 
    songprogress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     if(mediaPlayer != null && fromUser){ 
      mediaPlayer.seekTo(progress); 
     } 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
}); 

return view; 
} 
private Runnable UpdateSongTime = new Runnable() { 
public void run() { 
    startTime = mediaPlayer.getCurrentPosition(); 
    start.setText(String.format("%d.%d", 

        TimeUnit.MILLISECONDS.toMinutes((long) startTime), 
        TimeUnit.MILLISECONDS.toSeconds((long) startTime) - 
          TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. 
            toMinutes((long) startTime))) 
    ); 
    songprogress.setProgress((int)startTime); 
    myHandler.postDelayed(this, 100); 
} 
}; 
} 

SongAdapter.java

import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import java.util.ArrayList; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.widget.LinearLayout; 
import android.widget.TextView; 


public class SongAdapter extends BaseAdapter { 
private ArrayList<Song> songs; 
private LayoutInflater songInf; 
public SongAdapter(Context c, ArrayList<Song> theSongs){ 
    songs=theSongs; 
    songInf=LayoutInflater.from(c); 
} 
@Override 
public int getCount() { 
    return songs.size(); 
} 

@Override 
public Object getItem(int position) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //map to song layout 
    LinearLayout songLay = (LinearLayout)songInf.inflate 
      (R.layout.songlistitem, parent, false); 
    //get title and artist views 
    TextView songView = (TextView)songLay.findViewById(R.id.song_title); 
    TextView artistView = (TextView)songLay.findViewById(R.id.song_artist); 
    //get song using position 
    Song currSong = songs.get(position); 
    //get title and artist strings 
    songView.setText(currSong.getTitle()); 
    artistView.setText(currSong.getArtist()); 
    //set position as tag 
    songLay.setTag(position); 
    return songLay; 
} 
} 
+0

您可以参考http://stackoverflow.com/questions/16036572/how-to-pass-values-between-fragments –

+0

问题是,要获取Listview项目的详细信息(即选定的歌曲名称,艺术家姓名和歌曲文件名称),以便我可以将它传递给下一个片段。任何解决方案 –

+0

您可以创建一个属性来存储主活动中所需的信息。在SongList片段中,信息被添加回活动。并且在活动中,您在创建并显示下一个片段时通过包传递属性 –

回答

0

要获得所选歌曲的详细信息,您可以通过适配器在onItemClick()这样的方法中得到:

@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Toast.makeText(MainActivity.this, 
       "" + mAdapter.getItem(position), Toast.LENGTH_SHORT).show(); 
    } 

添加事件侦听器的ListView:

mWordListLV.setOnItemClickListener(this); 
0

您可以简单地使用Songig MusicPlayer库机器人。 Songig处理你所有的音乐播放列表,让你用许多回调来管理你的列表。 你可以将许多UI绑定到歌曲,以便在需要时更改它们。 例如,您可以将2个搜索栏绑定到歌曲,并且每次更新时歌曲都会更改 它们的进度。