2015-10-07 3 views
0

Je fais un Music Player App.J'ai deux Fragments différents pour SongsList (SongList.java) et Mediaplayer Controls (i.e Mediaplayer.java qui comprend la lecture, pause boutons). Maintenant, je veux connecter mon SongsList.java avec Mediaplayer.java. Je veux sélectionner une chanson de SongsList.java qui est jouée dans Mediaplayer.java. Comment fais-je ? S'IL VOUS PLAÎT AIDE !!!Lecteur de musique 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 (Certains boutons non encore mis en œuvre)

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

Vous pouvez consulter http://stackoverflow.com/questions/16036572/how-to-pass-values-between-fragments –

+0

Le problème est, pour obtenir les détails de l'élément Listview (c'est-à-dire le nom de la chanson sélectionnée, nom de l'artiste et nom du fichier songfile) afin que je puisse le passer au fragment suivant. Des solutions? –

+0

Vous pouvez créer un attribut pour stocker les informations requises dans l'activité principale. Dans le fragment SongList, l'information est ajoutée à l'activité. et Dans l'activité, vous passez l'attribut via l'ensemble lors de la création et de l'affichage du fragment suivant. –

Répondre

0

Pour obtenir les détails de la chanson sélectionnée, peut obtenir par l'adaptateur dans la méthode onItemClick() comme ceci:

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

Ajouter un événement Listener à ListView:

mWordListLV.setOnItemClickListener(this); 
0

Vous pouvez simplement utiliser Songig bibliothèque MusicPlayer pour android. Songig gère toutes vos listes de lecture de musique et vous permet de gérer votre liste avec de nombreux rappels. vous pouvez lier beaucoup d'ui à songig pour les changer si nécessaire. par exemple vous pouvez lier 2 seekbars à songig et songig changera progrès d'entre eux dans chaque mise à jour.