安卓:传递数据(临时演员)的片段(Android: Pass data(extras) to a f

2019-07-21 13:19发布

我是新来的Android编程和我有而传递Parcelable的一个ArrayList片段的问题。 这是推出的活动(工作好!),其中feedlist是parcelable 音乐的ArrayList。

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

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

片段活动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];
    }
};
}

当我运行这段代码我得到的问题是在片段onCreateView()方法显示java.lang.NullPointerException。 如果有人向我指出了正确的方向,看看我失败我将不胜感激了很多。

编辑 :问题解决了:我只是需要加入这一行的片段活动onCreate()方法(othwewise的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音乐。

Answer 1:

两件事情。 首先,我不认为你将要正确地传递给片段中的数据。 你需要传递给该片段是什么捆绑,而不是意图。 例如,如果我想的发送int值我将创建一个包,把片段int成束,然后设置捆绑作为参数创建片段时使用。

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 ,但并不需要如此。 如果你设置该参数的默认值这要看。

最后,我不认为你可以做到这一点onCreateView 。 我想你必须检索您的片段的内这一数据onActivityCreated方法。 我的理由如下。 onActivityCreated运行后的基本活动已经完成了自己onCreate方法。 如果你将要捆绑你durring活动的内检索信息onCreate方法,它不会将您的片段的过程中存在onCreateView 。 尝试使用此onActivityCreated更新你ListView后的内容。



Answer 2:

我宁愿Serializable =没有样板代码。 为了将数据传递到其他片段或活动的速度差到Parcelable无所谓。

我也总是会提供一个助手方法FragmentActivity ,这样你总是知道,必须要通过什么样的数据。 这里为你一个例子ListMusicFragment

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


Answer 3:

有一个简单的,为什么我要者优先捆绑由于在内存中没有重复的数据。 它包含了片段的初始化公共方法

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


public static ListMusicFragment createInstance(List<Music> music) {
    ListMusicFragment fragment = new ListMusicFragment();
    fragment.init(music);
    return fragment;
}

public void init(List<Music> music){
    this.listMusic = music;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState)
{

    View view = inflater.inflate(R.layout.musiclistview, container, false);
    listMusic = (ListView) view.findViewById(R.id.musicListView);
    listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics));

    return view;
}
}

在两个词,你用init方法创建一个片段的实例(U可以调用它为u想)你通过列表​​的创建没有通过序列化副本,该片段的实例参考。 这是非常有用的,因为如果你在列表中改变一些东西U将得到它在应用程序的其他部分和ofcourse,您使用较少的内存。



Answer 4:

通过@Rarw伟大的答案。 尝试使用束从一个片段信息传递到另一



文章来源: Android: Pass data(extras) to a fragment