首页 文章

如何实现onClickListener for button(在MainActivity中)播放和暂停片段中的歌曲?

提问于
浏览
-1

我正在构建一个音乐播放器,我有一个songs.java片段,它将SD卡中的所有歌曲显示在recyclerView中 . 当我点击任何一首歌时它开始播放 . 问题是,我还在MainActivity.java中实现了一个向上滑动的面板布局https://github.com/umano/AndroidSlidingUpPanel,当有一个来自recyclerView的歌曲和一个按钮(标记为红色)时,它有两个显示歌曲名称和艺术家名称的textView . 问题是,如果它很愚蠢我可以't figure out how to implement onClickListener on the button in MainActivity so that It plays and pauses the songs that are displayed in recyclerView. I hope my question is clear. Thanks in advance! Please don' t downnvote我的问题因为我非常喜欢新的android工作室 .

截屏示例:

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


        }
    });

2 回答

  • 0

    您必须在MainActivity.class中创建一个侦听器接口,您希望将数据发送到Songs.java .

    public interface OnSongCickListener {
        void onsongClicked();
    }
    

    在同一个MainActivity.class中添加一个方法,将侦听器注册到要发送数据的对象 . 将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");
                }
            }
        });
    

相关问题