FragmentActivity将bundle传递给xml中指定的FragmentList

时间:2014-03-13 10:09:08

标签: android android-fragments

我需要的概述:

将字符串从FragmentActivity传递到FragmentList。所述FragmentList在xml中指定如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MultiContactsFragmentList" >

...

<fragment
    android:id="@+id/multiContactsList_fragment"
    android:name="com.sf.lidgit_android.content.MultiContactsFragmentList"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

代码中存在的问题(顺便说一下,我使用支持库,因为我的目标是API级别10),在我的类中,从FragmentActivity扩展:< /强>

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    ...
            inviteByEmail();
}

public void inviteByEmail(){        
    setContentView(R.layout.activity_multi_contacts_email_picker);
    MultiContactsFragmentList fragmentList = 
            (MultiContactsFragmentList)
             getSupportFragmentManager().findFragmentById(R.id.multiContactsList_fragment);
    Bundle extras = new Bundle();
    extras.putString(MultiContactsFragmentList.DATA_TO_PICK, MultiContactsFragmentList.EMAIL_DATA);
    fragmentList.setArguments(extras);
}

这是事情, fragmentList null。我认为这是因为生命周期(我不知道FragmetnActivity - FragmentList生命周期。 FragmentList尚未创建。是吗?我知道另一种方法是让我的 FragmentActivity &#34;保存&#34;数据,并让FragmentList访问它(因为FragmentActivity可用于它的片段,我相信)。

修改

我的FragmentList类(我尝试将Bundle传递给的片段)实现了LoaderManager.LoaderCallbacks<Cursor>。我不知道是否有影响,但我尝试了下面的第一个答案,并且由于空指针异常导致我的FragmentList出错,看来 onLoadFinished( ..)方法在 onCreate(..)之前调用,因为null Pointer Exception发生在 onLoadFinished(..)上,说明adapter为空。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("invite", "oncreate called");
    String[] fromColumns = {ContactsContract.Contacts.DISPLAY_NAME, this.view_ID_Data};
    int[] toViews = {R.id.contact_name, R.id.contact_data};

    getLoaderManager().initLoader(MULTI_CONTACTS_LIST_LOADER, null, this);

    this.adapter = new SimpleCursorAdapter(
            getActivity().getApplicationContext(), R.layout.custom_list_contacts_multiple_choice,
            null, fromColumns, toViews,
            CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

    setListAdapter(adapter);
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
    adapter.swapCursor(cursor);
}

1 个答案:

答案 0 :(得分:1)

将您的布局更改为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

在你的活动中:

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    ...
    inviteByEmail();
}

public void inviteByEmail(){        
    setContentView(R.layout.activity_multi_contacts_email_picker);
    MultiContactsFragmentList fragmentList = new MultiContactsFragmentList();
    Bundle extras = new Bundle();
    extras.putString(MultiContactsFragmentList.DATA_TO_PICK, MultiContactsFragmentList.EMAIL_DATA);
    fragmentList.setArguments(extras);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.content, fragmentList);
    ft.commit();
}

片段的方法setArguments(Bundle args)只能在创建片段后立即调用,因此如果您在XML中嵌入片段,即使您调用它,也可能根本不会发生argumments设置。这样你就必须自己附加片段,但是当你访问它时你会有参数。