我需要的概述:
将字符串从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);
}
答案 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设置。这样你就必须自己附加片段,但是当你访问它时你会有参数。