2017-10-04 74 views
-1

我正在建立一个音乐播放器,并且我有一个songs.java片段,它将SD卡中的所有歌曲显示到recyclerView中。当我点击任何一首歌曲时,它就开始播放。问题是,我还有一个在MainActivity.java中实现的滑动面板布局https://github.com/umano/AndroidSlidingUpPanel,它有两个textView,当单击recyclerView的歌曲并显示一个按钮(标记为红色)时,显示歌曲名称和演出者名称。问题是我无法弄清楚如何在MainActivity中的按钮上实现onClickListener,以便播放和暂停在recyclerView中显示的歌曲。我希望我的问题很清楚。提前致谢!如果它很愚蠢,请不要降低我的问题,因为我对新的android studio非常感兴趣。如何实现onClickListener按钮(在MainActivity中)播放和暂停片段中的歌曲?

实施例的屏幕截图:

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扩展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); 
} 



} 

按钮点击:

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


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

      else { mListener.onsongClicked(false);} 


     } 
    }); 
+0

所以你必须从活动的发送按钮,点击呼叫片段RIT? –

+0

是的,我的意思是我想暂停并使用MainActivity中的按钮播放片段的歌曲! –

+0

你在viewpager或Framlayout容器中有片段? –

回答

0

你必须创建从那里,你想将数据发送到Songs.java在MainActivity.class一个监听器接口。

public interface OnSongCickListener { 
    void onsongClicked(); 
} 

在同一MainActivity.class添加一个方法注册一个带有要发送data.Keep OnSongCickListener作为私有成员变量的对象听众;

private OnSongCickListener mListener; 

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

当你必须通过一些动作监听器或一些按钮,点击发送数据从你的类将数据发送到活动或任何注册类这样

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

然后在你的Songs.java类创建监听器类的对象并像这样调用方法。

MainActivity activity=(MainActivity)getActivity; 

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

试试这个。 创建片段的一种方法像

onButtonClickInActivity()

,然后在你的活动这样

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"); 
      } 
     } 
    });