将对象从活动传递到片段

时间:2012-03-29 19:19:10

标签: android

我有一个使用Activity的{​​{1}}。我只想将此Fragment中的对象传递给Activity

我怎么能这样做? 到目前为止我见过的所有教程都是从资源中检索数据的。

编辑:

让我们更精确一点:

我的活动左侧部分有Fragment。当您单击它时,想法是在右侧部分加载ListView

当我输入此Fragment时,通过Activity提供了一个对象Category。此Object包含其他对象的列表Intent(包含String列表)。这些Questions对象显示在ListView上。 当我点击Questions中的一个项目时,我想在ListViewString中)显示Fragment列表。

为此,我使用布局调用ListView中的setContentView()。在此布局中,Activity定义了要调用的正确类。 当我调用此Fragment时,我setContentView()的{​​{1}}被调用,但此时onCreateView()返回null。

Fragment致电之前,我怎么设法让它充满? (告诉我,如果我不够清楚)

由于

8 个答案:

答案 0 :(得分:121)

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();

答案 1 :(得分:11)

您应该在片段中创建一个方法,该方法接受您希望传递给它的对象类型。在这种情况下,我将其命名为“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()

答案 2 :(得分:9)

在您的活动课程中:

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();

}

注意:您的对象应该实现Serializable接口

然后在你的片段中:

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;
}
}

答案 3 :(得分:3)

通过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();

备注:我的片段扩展了&#34; android.support.v4.app.Fragment&#34;因此我必须使用&#34; getSupportFragmentManager()&#34;。当然,这个原则也适用于片段类扩展&#34; Fragment&#34;,但是你必须使用&#34; getFragmentManager()&#34;。

答案 4 :(得分:1)

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

首先将对象存储在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);

然后在Fragment

中检索包

&#13;
&#13;
       // 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");
&#13;
&#13;
&#13;

答案 5 :(得分:0)

从以下示例中获取参考。

<强> 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();

答案 6 :(得分:0)

如果数据应在整个应用程序生命周期中生存并在多个片段或活动之间共享,则可以考虑使用Model类,这样可以减少序列化开销。

选中此design example

答案 7 :(得分:0)

这个对我有用:

活动中:

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

在Fragment的onCreateView方法中:

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

用您的活动名称替换MainActivity