安卓:将数据(附加)传递到片段

我是Android编程的新手,在将Mailable的ArrayList传递给片段时遇到了问题。这是启动的活动(运行良好!),其中提要列表是可包裹音乐的数组列表

Intent in = new Intent(context, ListMusicsActivity.class);

in.putExtra("arrayMusic", feedList);
activity.startActivity(in);

Fragment Activity onCreate() 方法:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activitymusiclist);

    if(savedInstanceState != null)
    {
        ListMusicFragment frag = new ListMusicFragment();
        frag.setArguments(getIntent().getExtras());
    }
}

片段代码:

public class ListMusicFragment extends SherlockFragment{

private ArrayList<Music> listMusics = new ArrayList<Music>();
private ListView listMusic;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState)
{
    listMusics = (ArrayList<Music>) getArguments().getSerializable("arrayMusic");
    View view = inflater.inflate(R.layout.musiclistview, container, false);
    listMusic = (ListView) view.findViewById(R.id.musicListView);
    listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics));

    return view;
}
}

我认为问题出在生产线上

listMusics = (ArrayList<Music>) getArguments().getSerializable("arrayMusic");

最后,这是我的音乐课:

public class Music implements Parcelable{

private String url;
private String artist;
private String title;
private String duration;
private String info_url;
private String lyrics;


public Music(String url, String artist, String title, 
    String duration, String lyrics, String info_url)
{
    this.url = url;
    this.artist = artist;
    this.title = title;
    this.duration = duration;
    this.lyrics = lyrics;
    this.info_url = info_url;
}

public Music(Parcel in)
{
    url = ParcelUtils.readString(in);
    artist = ParcelUtils.readString(in);
    title = ParcelUtils.readString(in);
    duration = ParcelUtils.readString(in);
    info_url = ParcelUtils.readString(in);
    lyrics = ParcelUtils.readString(in);
}

public String getUrl()
{
    return url;
}

public String getArtist()
{
    return artist;
}

public String getTitle()
{
    return title;
}

public String getDuration()
{
    return duration;
}

public String getLyrics()
{
    return lyrics;
}

public String getInfo()
{
    return info_url;
}

@Override
public int describeContents() {
    return 0;
}


@Override
public void writeToParcel(Parcel dest, int flags)
{
    ParcelUtils.writeString(dest, url);
    ParcelUtils.writeString(dest, artist);
    ParcelUtils.writeString(dest, title);
    ParcelUtils.writeString(dest, duration);
    ParcelUtils.writeString(dest, lyrics);
    ParcelUtils.writeString(dest, info_url);
}

public static final Parcelable.Creator<Music> CREATOR = 
    new Parcelable.Creator<Music>() {

    public Music createFromParcel(Parcel in)
    {
        return new Music(in);
    }

    public Music[] newArray(int size)
    {
        return new Music[size];
    }
};
}

当我运行此代码时,我遇到的问题是 Fragment onCreateView() 方法中的 java.lang.NullPointerException。如果有人给我指出正确的方向,看看我在哪里失败,我将不胜感激。

编辑:问题已解决:我只需要将此行添加到片段Active onCreate()方法(因此,getArguments()将返回null):

getSupportFragmentManager().beginTransaction()
    .add(android.R.id.content, frag).commit();

并将其添加到片段代码中:

@Override
    public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    Bundle bundle = getArguments();
    if(bundle != null)
    {
        listMusics = bundle.getParcelableArrayList("arrayMusic");
        listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics));
    }
}

其中,listMusics是音乐的一个。ArrayListParcelable


答案 1

两件事。首先,我不认为您正在正确添加要传递给片段的数据。您需要传递给片段的是一个捆绑包,而不是意图。例如,如果我想向片段发送一个值,我会创建一个捆绑包,将 放入该捆绑包中,然后将该捆绑包设置为创建片段时使用的参数。intint

Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);

其次,要检索该信息,您需要获取发送到片段的参数。然后,根据标识该值的键提取该值。例如,在您的片段中:

Bundle bundle = this.getArguments();
if (bundle != null) {
    int i = bundle.getInt(key, defaulValue);
}

您获得的内容会根据您放置的内容而变化。此外,默认值通常是,但不需要是。这取决于是否为该参数设置了默认值。null

最后,我认为你不能在.我认为您必须在片段的方法中检索此数据。我的理由如下。 在基础活动完成其自己的方法后运行。如果要在活动方法期间将要检索的信息放在捆绑包中,则在片段的 .尝试在 中使用它,稍后再更新您的内容。onCreateViewonActivityCreatedonActivityCreatedonCreateonCreateonCreateViewonActivityCreatedListView


答案 2

我更喜欢=没有样板代码。对于将数据传递到其他片段或活动,与可包裹的速度差异无关紧要。Serializable

我也总是为 or 提供一个帮助器方法,这样你就永远知道,哪些数据必须传递。这里有一个例子:FragmentActivityListMusicFragment

private static final String EXTRA_MUSIC_LIST = "music_list";

public static ListMusicFragment createInstance(List<Music> music) {
    ListMusicFragment fragment = new ListMusicFragment();
    Bundle bundle = new Bundle();
    bundle.putSerializable(EXTRA_MUSIC_LIST, music);
    fragment.setArguments(bundle);
    return fragment;
}

@Override
public View onCreateView(...) { 
    ...
    Bundle bundle = intent.getArguments();
    List<Music> musicList = (List<Music>)bundle.getSerializable(EXTRA_MUSIC_LIST);
    ...
}

推荐