将对象从活动传递到片段

Nic*_*ico 71 android

我有一个Activity用的Fragment.我只是想将一个对象传递Activity给它Fragment.

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

编辑:

让我们更精确一点:

我的活动ListView在左侧部分有一个.单击它时,想法是Fragment在右侧部分加载.

当我输入这个时Activity,一个对象Category通过Intent.此对象包含其他对象的列表Questions(包含字符串列表).这些Questions对象显示在ListView上.当我点击其中的一个项目时ListView,我想将列表显示StringFragment(进入a ListView)中.

要做到这一点,setContentView()Activity用布局调用我的.在此布局中定义了Fragment要调用的正确类.当我调用它时setContentView(),调用onCreateView()my Fragment,但此时getArguments()返回null.

我怎么能设法在电话会议之前填写onCreateView()?(告诉我,如果我不够清楚)

谢谢

Mac*_*rse 126

在中创建静态方法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
}
Run Code Online (Sandbox Code Playgroud)

之后您可以通过Activity执行以下操作来调用它:

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

  • 最好的答案,但你忘了说`Object`需要实现`Serializable`才能工作(在这种情况下,对象`Describable`). (14认同)
  • 我想传递一些不是Serializable的对象是什么? (8认同)
  • 我很想知道为什么不在newInstance中设置`fragment.mDescribable = describeable;`?它有效,但有什么我在这里缺少的吗? (8认同)
  • putParcelable 是最佳实践方式 (2认同)
  • @RahulThakur你在这里错过了`m`前缀的意思.由于Java社区强烈鼓励数据封装的概念,因此应该注意私有字段不需要在外部访问.之所以将其作为参数从单例方法传递,是因为该字段在该上下文中是必需的,因此降低了您将忘记分配其值的潜在风险. (2认同)

dym*_*meh 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"
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用支持库,并且根据您正在使用的内容,对getSupportFragmentManager()的调用可能只是getFragmentManager()

  • 这不行.当你的应用程序在后台死亡,并且用户将其带回前台时,不一定会调用`setObject`. (7认同)
  • @MartinKonecny在这种情况下将再次调用onCreate方法(因为将重新创建活动),因此也将调用setObject.如果不是这样,请解释您的评论.谢谢. (4认同)
  • 在片段上使用此方法时要小心,该片段可以比托管视图更长(retainInstance为true). (2认同)

小智 11

在您的活动类中:

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

}
Run Code Online (Sandbox Code Playgroud)

注意:您的对象应该实现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;
}
}
Run Code Online (Sandbox Code Playgroud)


Shi*_*wal 7

从下面的例子中可以得到参考。

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

 MyEmployee myEmp;
 public void setEmployee(MyEmployee myEmp)
 {
     this.myEmp = myEmp;
 }
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)


thp*_*sch 5

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

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

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

并在实例化片段后在您的活动中使用所有需要的数据类型调用 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();
Run Code Online (Sandbox Code Playgroud)

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