gpt4 book ai didi

java - Android:将数据(附加)传递给 fragment

转载 作者:IT老高 更新时间:2023-10-28 11:47:48 25 4
gpt4 key购买 nike

我是 Android 编程新手,在将 Parcelable 的 ArrayList 传递给 fragment 时遇到问题。这是启动的 Activity(运行良好!),其中 feedlist 是可打包 Music 的 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());
}
}

fragment 代码:

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。如果有人指出我正确的方向以了解我的失败之处,我将不胜感激。

编辑:问题已解决:我只需要将这一行添加到 fragment Activity onCreate() 方法中(否则 getArguments() 将返回 null):

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

并将其添加到 fragment 代码中:

@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 是 Parcelable Music 的 ArrayList

最佳答案

两件事。首先,我认为您没有添加要正确传递给 fragment 的数据。您需要传递给 fragment 的是 bundle ,而不是 Intent 。例如,如果我想将 int 值发送到 fragment ,我将创建一个包,将 int 放入该包中,然后将该包设置为要使用的参数创建 fragment 时。

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

第二次检索您需要获取发送到 fragment 的参数的信息。然后,您根据您识别它的键提取该值。例如在您的 fragment 中:

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

你得到的变化取决于你放的东西。此外,默认值通常为 null,但并非必须如此。这取决于您是否为该参数设置了默认值。

最后,我认为您不能在 onCreateView 中执行此操作。我认为您必须在 fragment 的 onActivityCreated 方法中检索这些数据。我的推理如下。 onActivityCreated 在底层 Activity 完成其自己的 onCreate 方法后运行。如果您在 Activity 的 onCreate 方法期间将希望检索的信息放入包中,则在 fragment 的 onCreateView 期间将不存在该信息。尝试在 onActivityCreated 中使用它,稍后再更新您的 ListView 内容。

关于java - Android:将数据(附加)传递给 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15392261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com