亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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條經驗 獲得超8個贊

我更喜歡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 關注
  • 596 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號