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

我是Android编程的新手,将Parcelable的ArrayList传递给片段时遇到了问题。这是启动的活动(效果很好!),其中feedlist是可打包Music的ArrayList 。


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


in.putExtra("arrayMusic", feedList);

activity.startActivity(in);

片段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");


慕运维8079593
浏览 529回答 3
3回答

有只小跳蛙

我只需要将此行添加到片段Activity onCreate()方法中(否则getArguments()将返回null):getSupportFragmentManager().beginTransaction()&nbsp; &nbsp; .add(android.R.id.content, frag).commit();并将其添加到片段代码中:@Override&nbsp; &nbsp; public void onActivityCreated(Bundle savedInstanceState){&nbsp; &nbsp; super.onActivityCreated(savedInstanceState);&nbsp; &nbsp; Bundle bundle = getArguments();&nbsp; &nbsp; if(bundle != null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; listMusics = bundle.getParcelableArrayList("arrayMusic");&nbsp; &nbsp; &nbsp; &nbsp; listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics));&nbsp; &nbsp; }}其中,listMusics是ArrayList的Parcelable音乐。

蛊毒传说

两件事情。首先,我认为您没有正确添加要传递给片段的数据。您需要传递给片段的是捆绑包,而不是意图。例如,如果我想向int片段发送一个值,我将创建一个包,将其int放入该包中,然后将该包设置为创建片段时要使用的参数。Bundle bundle = new Bundle();bundle.putInt(key, value);fragment.setArguments(bundle);其次,要检索该信息,您需要将参数发送到片段。然后,根据您使用其标识的键来提取值。例如在您的片段中:Bundle bundle = this.getArguments();if (bundle != null) {&nbsp; &nbsp; int i = bundle.getInt(key, defaulValue);}您得到的改变取决于您放置的内容。同样,默认值通常是null但不是必须的。这取决于您是否为该参数设置默认值。最后,我认为您无法在中执行此操作onCreateView。我认为您必须在片段的onActivityCreated方法内检索此数据。我的推理如下。onActivityCreated在基础活动完成其自己的onCreate方法之后运行。如果您要在活动onCreate方法期间将要检索的信息放入捆绑包中,则在您的片段期间该信息将不存在onCreateView。尝试在其中使用它,稍后再onActivityCreated更新您的ListView内容。

qq_遁去的一_1

我更喜欢Serializable=没有样板代码。对于将数据传递到其他片段或活动,速度差与aParcelable无关紧要。我还将始终为Fragment或提供帮助方法Activity,这种方式您始终知道必须传递哪些数据。这是您的示例ListMusicFragment:private static final String EXTRA_MUSIC_LIST = "music_list";public static ListMusicFragment createInstance(List<Music> music) {&nbsp; &nbsp; ListMusicFragment fragment = new ListMusicFragment();&nbsp; &nbsp; Bundle bundle = new Bundle();&nbsp; &nbsp; bundle.putSerializable(EXTRA_MUSIC_LIST, music);&nbsp; &nbsp; fragment.setArguments(bundle);&nbsp; &nbsp; return fragment;}@Overridepublic View onCreateView(...) {&nbsp;&nbsp; &nbsp; ...&nbsp; &nbsp; Bundle bundle = intent.getArguments();&nbsp; &nbsp; List<Music> musicList = (List<Music>)bundle.getSerializable(EXTRA_MUSIC_LIST);&nbsp; &nbsp; ...}
打开App,查看更多内容
随时随地看视频慕课网APP