簡體   English   中英

將數據從片段發送到片段

[英]Sending data from Fragment to Fragment

我是目前正在練習Fragments的Android編程的初學者。 我有3個片段,我想將一些數據從一個發送到另一個。 在ArtistFragment中,我有一個藝術家列表,當用戶單擊某個藝術家時,我希望我的應用自動滑動到AlbumsFragment並僅顯示以前選擇的藝術家的專輯。 因此,它應該將albumsList發送到AlbumsFragment。 這是我的片段和適配器。 請幫忙。

public class ArtistsFragment extends Fragment {

private ArrayList<Artist> artistList = new ArrayList<Artist>();
private  ArrayList<Album> albumList = new ArrayList<Album>();
private ArrayList<Song> songList = new ArrayList<Song>();

private ListView artistView;
private View rootView;

@Override
public View onCreateView(LayoutInflater inflater,
        @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    rootView = inflater.inflate(R.layout.artists_fragment, container, false);

    showArtists();
    selectArtist();
    return rootView;
}

public void showArtists() {
    // TODO Auto-generated method stub
    artistList = (ArrayList<Artist>) getArguments().getSerializable("key");
    artistView = (ListView) rootView.findViewById(R.id.artistList);
    ArtistAdapter artistAdapter = new ArtistAdapter(getActivity(), R.layout.artists_item, artistList);
    artistView.setAdapter(artistAdapter);
}

public void selectArtist(){
    artistView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position,
                long arg3) {

            Artist artist = (Artist) artistView.getAdapter().getItem(position);
            albumList = artist.getAlbumList();
            Bundle bundle = new Bundle();
            bundle.putSerializable("key", albumList);

            getActivity().getActionBar().setSelectedNavigationItem(1);

        }
    });
}

}

public class AlbumsFragment extends Fragment {

public View rootView;
private ListView albumView;
private ArrayList<Album> albumList = new ArrayList<Album>();



@Override
public View onCreateView(LayoutInflater inflater,
        @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    rootView = inflater.inflate(R.layout.albums_fragment, container, false);

    showAlbums();
    selectAlbum();
    return rootView;
}



private void showAlbums() {
    albumList = (ArrayList<Album>) getArguments().getSerializable("key");
    albumView = (ListView) rootView.findViewById(R.id.albumList);
    AlbumAdapter albumAdapter = new AlbumAdapter(getActivity(), R.layout.album_item, albumList);
    albumView.setAdapter(albumAdapter);
}

public void selectAlbum(){
    albumView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            getActivity().getActionBar().setSelectedNavigationItem(2);
        }
    });
}

}

最后是我的TabsPagerAdapter。

public class TabsPagerAdapter extends FragmentPagerAdapter {

private ArrayList<Artist> artistList = new ArrayList<Artist>();
private ArrayList<Album> albumList = new ArrayList<Album>();
private ArrayList<Song> songList = new ArrayList<Song>();

public TabsPagerAdapter(FragmentManager fm, ArrayList<Artist> artistList, ArrayList<Album> albumList, ArrayList<Song> songList) {
    super(fm);
    setArtistList(artistList);
    setAlbumList(albumList);
    setSongList(songList);

    // TODO Auto-generated constructor stub
}

@Override
public Fragment getItem(int index) {
    // TODO Auto-generated method stub
    switch(index){
    case 0:
        ArtistsFragment artistFragment = new ArtistsFragment();
        Bundle artistBundle = new Bundle();
        artistBundle.putSerializable("key", artistList);
        artistFragment.setArguments(artistBundle);
        return artistFragment;
    case 1:
        AlbumsFragment albumsFragment = new AlbumsFragment();
        Bundle albumBundle = new Bundle();
        albumBundle.putSerializable("key", albumList);
        albumsFragment.setArguments(albumBundle);
        return albumsFragment;
    case 2:
        SongsFragment songsFragment = new SongsFragment();
        Bundle songBundle = new Bundle();
        songBundle.putSerializable("key", songList);
        songsFragment.setArguments(songBundle);
        return songsFragment;
    }
    return null;
}

片段無法直接通信。 這在整個活動中都會發生。 兩個片段永遠不要直接通信。 看一下這個: http : //developer.android.com/training/basics/fragments/communicating.html

我更喜歡另一種方式,例如使用otto等事件總線: http : //square.github.io/otto/

使用otto可以發布一個片段中的事件,並訂閱另一個片段中的事件。

嘗試直接從一個片段與另一個片段進行通信不是一個好主意。

最好的方法是在活動中提供要在活動中實現的Callback接口,或者在您的情況下,可以在FragmentPagerAdapter中查看[http://developer.android.com/guide/components/fragments.html #CommunicatingWithActivity] [1]

在回調方法中,您可以傳遞所需的任何參數,然后啟動其他片段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM