如何为按钮(在 MainActivity 中)实现 onClickListener 以播放和暂停片段中的歌曲?

How to implement onClickListener for button (in MainActivity) to play and pause Songs from fragment?

我正在构建一个音乐播放器,我有一个 songs.java 片段可以将 SD 卡中的所有歌曲显示到 recyclerView 中。当我单击任何一首歌曲时,它就会开始播放。问题是,我还有一个在 MainActivity.java 中实现的向上滑动面板布局 https://github.com/umano/AndroidSlidingUpPanel,它有两个文本视图,当单击来自 recyclerView 的歌曲时显示歌曲名称和艺术家姓名,以及一个按钮(标记为红色).问题是我不知道如何在 MainActivity 中的按钮上实现 onClickListener,以便播放和暂停显示在 recyclerView 中的歌曲。我希望我的问题很清楚。提前致谢!如果我的问题很愚蠢,请不要对我的问题投反对票,因为我对新 android 工作室很感兴趣。

示例截图:

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:

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


        }
    });

您必须在要将数据发送到 Songs.java 的 MainActivity.class 中创建侦听器接口。

public interface OnSongCickListener {
    void onsongClicked();
}

在同一个方法中添加一个MainActivity.class将监听器注册到要发送的对象data.KeepOnSongCickListener作为私有成员变量;

private OnSongCickListener mListener;

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

当您必须通过侦听器发送数据以执行某些操作或单击某些按钮时,将数据从您的 class 发送到 activity 或任何已注册的 class,就像这样

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

然后在你的 Songs.java class 中创建一个侦听器对象 class 并像这样调用方法。

MainActivity activity=(MainActivity)getActivity;

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

试试这个。 在

这样的片段中创建一个方法

onButtonClickInActivity()

然后在你的activity中像这样

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