为了账号安全,请及时绑定邮箱和手机立即绑定

Android:将数据(扩展名)传递给片段

Android:将数据(扩展名)传递给片段

慕运维8079593 2019-12-17 14:37:17
我是Android编程的新手,将Parcelable的ArrayList传递给片段时遇到了问题。这是启动的活动(效果很好!),其中feedlist是可打包Music的ArrayList 。Intent in = new Intent(context, ListMusicsActivity.class);in.putExtra("arrayMusic", feedList);activity.startActivity(in);片段Activity onCreate()方法:@Overrideprotected 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;@Overridepublic 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");
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

我只需要将此行添加到片段Activity 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是ArrayList的Parcelable音乐。


查看完整回答
反对 回复 2019-12-17
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

两件事情。首先,我认为您没有正确添加要传递给片段的数据。您需要传递给片段的是捆绑包,而不是意图。例如,如果我想向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方法之后运行。如果您要在活动onCreate方法期间将要检索的信息放入捆绑包中,则在您的片段期间该信息将不存在onCreateView。尝试在其中使用它,稍后再onActivityCreated更新您的ListView内容。


查看完整回答
反对 回复 2019-12-17
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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


我还将始终为Fragment或提供帮助方法Activity,这种方式您始终知道必须传递哪些数据。这是您的示例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);

    ...

}


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 525 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信