将对象从活动传递到片段

我有一个使用 FragmentActivity。我只是想把一个对象从这个 Activity传递给 Fragment

我怎么能这么做呢? 到目前为止,我所看到的所有从资源中检索数据的教程。

编辑:

让我们更精确一点:

我的活动在左边有一个 ListView。当你点击它的时候,想法是在右边加载一个 Fragment

当我输入这个 Activity时,通过 Intent给出一个对象 Category。此对象包含其他对象的 List Questions(其中包含 List of String)。这些 Questions对象显示在 ListView 上。 当我从 ListView中单击一个项目时,我想将 String的 List 显示到 Fragment中(显示到 ListView中)。

为此,我从 Activity中调用 setContentView(),并给出一个布局。在这个布局中定义了带有正确调用的类的 Fragment。 当我调用这个 setContentView()时,我的 FragmentonCreateView()被调用,但是在这个时候,getArguments()返回 null。

我怎样才能在 onCreateView()电话打来之前把它填满呢? (告诉我,如果我不够清楚)

谢谢

145702 次浏览

您应该在片段中创建一个方法,该方法接受您希望传递给它的对象类型。在这种情况下,我把它命名为“ setObject”(很有创意吧?:)该方法然后可以执行任何操作,你需要与该对象。

MyFragment fragment;


@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);


if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
fragment = new MyFragment();
getSupportFragmentManager().beginTransaction().add(android.R.id.content, detailsFragment)
.commit();
} else {
fragment = (MyFragment) getSupportFragmentManager().findFragmentById(
android.R.id.content);
}




fragment.setObject(yourObject); //create a method like this in your class "MyFragment"
}

请注意,我正在使用支持库,对 getSupportFragmentManager ()的调用可能只是为您准备的 getFragmentManager () ,这取决于您使用的是什么

Fragment中创建一个静态方法,然后使用 getArguments()获取它。

例如:

public class CommentsFragment extends Fragment {
private static final String DESCRIBABLE_KEY = "describable_key";
private Describable mDescribable;


public static CommentsFragment newInstance(Describable describable) {
CommentsFragment fragment = new CommentsFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(DESCRIBABLE_KEY, describable);
fragment.setArguments(bundle);


return fragment;
}


@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {


mDescribable = (Describable) getArguments().getSerializable(
DESCRIBABLE_KEY);


// The rest of your code
}

之后你可以从 Activity调用它,比如:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = CommentsFragment.newInstance(mDescribable);
ft.replace(R.id.comments_fragment, fragment);
ft.commit();

在你的活动课上:

public class BasicActivity extends Activity {


private ComplexObject co;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_page);


co=new ComplexObject();
getIntent().putExtra("complexObject", co);


FragmentManager fragmentManager = getFragmentManager();
Fragment1 f1 = new Fragment1();
fragmentManager.beginTransaction()
.replace(R.id.frameLayout, f1).commit();


}

注意: 您的对象应该实现可串行化的接口

然后在你的碎片里:

public class Fragment1 extends Fragment {


ComplexObject co;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Intent i = getActivity().getIntent();


co = (ComplexObject) i.getSerializableExtra("complexObject");


View view = inflater.inflate(R.layout.test_page, container, false);
TextView textView = (TextView) view.findViewById(R.id.DENEME);
textView.setText(co.getName());


return view;
}
}

通过 bundle 传递参数仅限于某些数据类型。但是您可以通过这种方式将任何数据传输到您的片段:

在片段中创建一个这样的公共方法

public void passData(Context context, List<LexItem> list, int pos) {
mContext = context;
mLexItemList = list;
mIndex = pos;
}

在实例化片段之后,在您的活动调用 passData ()中使用所有需要的数据类型

        WebViewFragment myFragment = new WebViewFragment();
myFragment.passData(getApplicationContext(), mLexItemList, index);
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.my_fragment_container, myFragment);
ft.addToBackStack(null);
ft.commit();

备注: 我的片段扩展了“ android.support. v4.app”。片段”,因此我必须使用“ getSupportFragmentManager ()”。当然,这个原则也适用于扩展“片段”的片段类,但是之后必须使用“ getFragmentManager ()”。

从下面的示例中获取引用。

1. 片段 : 为片段中需要其对象的类创建引用变量。只需为引用变量创建一个 setter 方法,并在从活动中替换片段之前调用 setter。

 MyEmployee myEmp;
public void setEmployee(MyEmployee myEmp)
{
this.myEmp = myEmp;
}

2. 在活动中 :

   //we need to pass object myEmp to fragment myFragment


MyEmployee myEmp = new MyEmployee();


MyFragment myFragment = new MyFragment();


myFragment.setEmployee(myEmp);


FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main_layout, myFragment);
ft.commit();

要将对象传递给片段,请执行以下操作:

首先将对象存储在 Bundle 中,不要忘记在类中放置可序列化的实现。

            CategoryRowFragment fragment = new CategoryRowFragment();


// pass arguments to fragment
Bundle bundle = new Bundle();


// event list we want to populate
bundle.putSerializable("eventsList", eventsList);


// the description of the row
bundle.putSerializable("categoryRow", categoryRow);


fragment.setArguments(bundle);

然后在碎片中检索包

       // events that will be populated in this row
mEventsList = (ArrayList<Event>)getArguments().getSerializable("eventsList");


// description of events to be populated in this row
mCategoryRow = (CategoryRow)getArguments().getSerializable("categoryRow");

如果数据应该在整个应用程序生命周期中存活,并在多个片段或活动之间共享,那么可以考虑使用一个具有较少序列化开销的 Model类。

看看这个 设计例子

这个对我很管用:

活动内容:

User user;
public User getUser(){ return this.user;}

片段的 onCreateView 方法:

User user = ((MainActivity)getActivity()).getUser();

用活动名称替换 MainActivity