2017-10-04 4 views
-1

Je construis un lecteur de musique et j'ai un fragment songs.java qui affiche toutes les chansons de la carte SD dans le recyclerView. Quand je clique sur une chanson, elle commence à jouer. Le problème est, j'ai aussi une mise en page de panneau coulissant https://github.com/umano/AndroidSlidingUpPanel implémentée dans MainActivity.java et il a deux textViews qui affiche le nom de la chanson et le nom de l'artiste quand un morceau de recyclerView est cliqué et un bouton (marqué en rouge). Le problème est que je n'arrive pas à comprendre comment implémenter onClickListener sur le bouton MainActivity pour qu'Il joue et mette en pause les chansons affichées dans recyclerView. J'espère que ma question est claire. Merci d'avance! S'il vous plaît ne pas downnvote ma question si c'est bête car je suis très nouveau studio android.Comment mettre en œuvre onClickListener pour le bouton (dans MainActivity) pour lire et mettre en pause des morceaux de fragment?

Exemple capture d'écran:

enter image description here

Songs.java

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.songs_activity, container, false); 

    Activity activity = getActivity(); 


    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); 
    recyclerView.setLayoutManager(linearLayoutManager); 


    songAdapter = new SongAdapter(getContext(), SongList, new SongAdapter.RecyclerItemClickListener() { 
     @Override 
     public void onClickListener(SongInfoModel song, int position) { 

      Toast.makeText(getContext(), song.getSongName(), Toast.LENGTH_SHORT).show(); 

      Activity activity = getActivity(); 
      if (activity instanceof MainActivity) { 

       mainActivity = (MainActivity) activity; 
       mainActivity.setsongText(song); 

      } 
      prepareSong(song); 



     } 

     @Override 
     public void onLongClickListener(SongInfoModel song, int position) { 
      Toast.makeText(getContext(), "You long clicked me, thank you!", Toast.LENGTH_SHORT).show(); 
     } 


    }); 

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0"; 
    Cursor cursor = getActivity().getContentResolver().query(uri, null, selection, null, null); 
    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      do { 
       String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 
       String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); 
       Long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); 
       String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
       // String AlbumArt = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 

       SongInfoModel s = new SongInfoModel(name, artist, null, null, null, duration, data); 
       SongList.add(s); 

      } while (cursor.moveToNext()); 
     } 


     cursor.close(); 

     Collections.sort(SongList, new Comparator<SongInfoModel>() { 
      @Override 
      public int compare(SongInfoModel lhs, SongInfoModel rhs) { 
       return lhs.getSongName().compareTo(rhs.getSongName()); 
      } 
     }); 



    } 


    alphaAdapter = new ScaleInAnimationAdapter(songAdapter); 
    alphaAdapter.setDuration(1000); 
    alphaAdapter.setInterpolator(new OvershootInterpolator()); 
    alphaAdapter.setFirstOnly(false); 
    recyclerView.setAdapter(alphaAdapter); 
    alphaAdapter.notifyDataSetChanged(); 


    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 



    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 

      togglePlay(mp); 
     } 
    }); 

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 




     } 
    }); 


    return view; 
} 




private void prepareSong(SongInfoModel song) { 


    mediaPlayer.reset(); 


    try { 
     mediaPlayer.setDataSource(song.getData()); 
     mediaPlayer.prepareAsync(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private void togglePlay(MediaPlayer mp) { 

    if (mp.isPlaying()) { 
     mp.stop(); 

     mp.reset(); 
    } else { 

     mp.start(); 


    } 


} 

MainActivity.java:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 



    buttonabc = findViewById(R.id.songButton); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     Window w = getWindow(); // in Activity's onCreate() for instance 
     w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 
    } 
    sectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager()); 

    viewPager = (ParallaxViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 
    viewPager.setOffscreenPageLimit(6); 


    smartTabLayout = (SmartTabLayout) findViewById(R.id.viewpagertab); 
    smartTabLayout.setViewPager(viewPager); 


    backarrow = (ImageView) findViewById(R.id.imageView); 

    backarrow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      resideMenu.openMenu(ResideMenu.DIRECTION_LEFT); 
     } 
    }); 

    SongNameSlide = findViewById(R.id.SongNameSlide); 
    ArtistNameSlide = findViewById(R.id.ArtistNameSlide); 


    slidingUpPanelLayout = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout); 




    slidingUpPanelLayout.addPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { 
     @Override 
     public void onPanelSlide(View panel, float slideOffset) { 

      Log.i(TAG, "onPanelSlide, offset " + slideOffset); 

      SongNameSlide.setAlpha(1 - slideOffset); 
      ArtistNameSlide.setAlpha(1 - slideOffset); 
      buttonabc.setAlpha(1 - slideOffset); 
      slidingUpPanelLayout.setDragView(panel); 


     } 


     @Override 
     public void onPanelStateChanged(View panel, SlidingUpPanelLayout.PanelState previousState, SlidingUpPanelLayout.PanelState newState) { 



     } 
    }); 

    slidingUpPanelLayout.setFadeOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); 

     } 
    }); 



    setUpMenu(); 



} 

public void setsongText(SongInfoModel songInfoModel){ 

    SongNameSlide.setText(songInfoModel.getSongName()); 
    ArtistNameSlide.setText(songInfoModel.getArtistName()); 

} 

SongAdapter.java:

SongAdapter public class étend RecyclerView.Adapter {

ArrayList<SongInfoModel> SongList = new ArrayList<>(); 
Context context; 
private RecyclerItemClickListener listener; 
public OnSongClickListener mListener; 




public SongAdapter(Context context, ArrayList<SongInfoModel> SongList, RecyclerItemClickListener listener) { 

    this.context = context; 
    this.SongList = SongList; 
    this.listener = listener; 

} 




@Override 
public SongAdapter.SongHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(context).inflate(R.layout.row_song, parent, false); 
    return new SongHolder(view); 
} 

@Override 
public void onBindViewHolder(final SongAdapter.SongHolder holder, final int position) { 



    final SongInfoModel songInfoModel = SongList.get(position); 

    if(songInfoModel!= null){ 

    holder.songName.setText(songInfoModel.SongName); 
    holder.artistName.setText(songInfoModel.ArtistName); 
    holder.duration.setText(String.valueOf(songInfoModel.duration)); 
    String duration = Utility.convertDuration(songInfoModel.getDuration()); 
    holder.duration.setText(duration); 

     holder.bind(songInfoModel, listener); 
    } 

} 

@Override 
public int getItemCount() { 
    return SongList.size(); 
} 

public class SongHolder extends RecyclerView.ViewHolder { 
    TextView songName; 
    TextView artistName; 
    TextView duration; 


    public SongHolder(View itemView) { 

     super(itemView); 
     songName = (TextView)itemView.findViewById(R.id.SongName); 
     artistName= (TextView)itemView.findViewById(R.id.ArtistName); 
     duration = (TextView) itemView.findViewById(R.id.duration); 

    } 

    public void bind(final SongInfoModel songInfoModel, final RecyclerItemClickListener listener) { 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listener.onClickListener(songInfoModel, getLayoutPosition()); 

      } 
     }); 

     itemView.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View view) { 

       listener.onLongClickListener(songInfoModel, getLayoutPosition()); 
       return true; 
      } 
     }); 

    } 



} 

public void setOnSongClickListener(OnSongClickListener listener) { 
    mListener = listener; 
} 


public interface RecyclerItemClickListener{ 

    void onClickListener(SongInfoModel song, int position); 
    void onLongClickListener(SongInfoModel song, int position); 

} 

public interface OnSongClickListener { 
    void onsongClicked(boolean songPlayed); 
} 

if(mListener!=null){ 
    mListener.onsongClicked(false); 
} 



} 

bouton clic:

buttonabc.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 


      if (mListener!=null) 
      { 
       mListener.onsongClicked(true); 
       mListener=null; 
      } 

      else { mListener.onsongClicked(false);} 


     } 
    }); 
+0

de sorte que vous devez envoyer le bouton d'appel de clic de l'activité à fragmenter RIT? –

+0

oui, je veux dire que je veux faire une pause et jouer les chansons du fragment en utilisant le bouton dans MainActivity! –

+0

vous avez fragment dans viewpager ou dans le conteneur Framlayout? –

Répondre

0

Vous devez créer une interface d'écoute dans le MainActivity.class d'où vous voulez envoyer des données à Songs.java.

public interface OnSongCickListener { 
    void onsongClicked(); 
} 

Ajouter une méthode dans le même MainActivity.class pour enregistrer l'écouteur avec l'objet dans lequel vous souhaitez envoyer OnSongCickListener data.Keep comme membre privé;

private OnSongCickListener mListener; 

public void setOnSongClickListener(OnSongCickListener listener) { 
    mListener = listener; 
} 

Lorsque vous devez envoyer des données par l'auditeur sur une action ou d'un bouton cliquez sur envoyer les données de votre classe à l'activité ou toute catégorie enregistrée comme celui-ci

if(mListener!=null){ 
    mListener.onsongClicked(); 
} 

Ensuite, dans votre Songs.java class crée un objet de la classe de l'écouteur et appelle la méthode comme ceci.

MainActivity activity=(MainActivity)getActivity; 

activity.setOnSongClickListener(new RecyclerAdapter.OnSongCickListener(){ 
    @Override 
    public void onsongClicked() { 
     if(mediaPlayer.isPlaying()){ 
      mPlayer.pause(); 
     } else { 
      mPlayer.start(); 
     } 
    } 
}); 
0

essayez ceci. Créer une méthode dans le fragment comme

onButtonClickInActivity()

puis dans votre activité comme celle

buttonActivity.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + pager.getCurrentItem()); 
      if (page != null) { 
       ((MyFragment)page).onButtonClickInActivity("Your Data to pass"); 
      } 
     } 
    });