2017-10-04 2 views
-1

Ich baue einen Musik-Player und ich habe ein songs.java-Fragment, das alle Lieder von der SD-Karte in den RecyclerView zeigt. Wenn ich auf eines der Songs klicke, beginnt es zu spielen. Das Problem ist, ich habe auch ein gleitendes Panel-Layout https://github.com/umano/AndroidSlidingUpPanel in MainActivity.java implementiert und es hat zwei textViews, die Song-Name und Künstlername angezeigt, wenn ein Lied von RecyclerView angeklickt wird und eine Schaltfläche (rot markiert). Das Problem ist, ich kann nicht herausfinden, wie onClickListener auf der Schaltfläche in MainActivity zu implementieren, so dass es die Lieder, die in RecyclerView angezeigt werden, spielt und pausiert. Ich hoffe meine Frage ist klar. Danke im Voraus! Bitte nicht meine Frage downnvote, wenn es albern ist, da ich sehr zu neuen Android Studio bin.Wie implementiert man onClickListener für die Schaltfläche (in MainActivity) zum Abspielen und Anhalten von Songs aus dem Fragment?

Beispiel Screenshot:

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:

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



} 

Schaltfläche klicken:

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


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

      else { mListener.onsongClicked(false);} 


     } 
    }); 
+0

so müssen Sie Schaltfläche klicken Anruf von Aktivität senden rit fragmentieren? –

+0

Ja, ich meine, ich möchte die Lieder des Fragments pausieren und abspielen, indem ich den Button in MainActivity benutze! –

+0

Sie haben Fragment in Viewpager oder in Framlayout Container? –

Antwort

0

Sie haben eine Listener-Schnittstelle im MainActivity.class zu erstellen, von dem Sie Daten Songs.java zu senden.

public interface OnSongCickListener { 
    void onsongClicked(); 
} 

ein Verfahren in der gleichen MainActivity.class Fügen Sie den Hörer mit dem Objekt zu registrieren, wo Sie data.Keep OnSongCickListener als private Variable senden möchten;

private OnSongCickListener mListener; 

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

Wenn Sie auf eine Aktion Daten über den Hörer senden oder eine Schaltfläche klicken Sie senden Daten aus Ihrer Klasse auf die Aktivität oder jede registrierte Klasse wie diese

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

Dann in Ihrem Songs.java Klasse erstellen Sie ein Objekt der Listener-Klasse und rufen Sie die Methode so auf.

MainActivity activity=(MainActivity)getActivity; 

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

versuchen Sie dies. Erstellen Sie eine Methode in Fragmente wie

onButtonClickInActivity()

und dann in Ihrer Aktivität wie diese

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