无法通过Bundle

时间:2015-08-12 08:39:35

标签: android android-fragments

我正在学习android基础知识,我在创建第一个应用程序时遇到了这个问题。我有一个活动将数据传递给片段。活动的OnCreate方法有一个这样的块:

    if(savedInstanceState == null){
        DetailActivityFragment detailFrag = DetailActivityFragment.newInstance(movieId);
        getSupportFragmentManager().beginTransaction().add(android.R.id.content,detailFrag).commit();
    }

    setContentView(R.layout.activity_detail);

在片段(activity_detail),如果我执行getParameters(),我会收到null。通过游戏,我发现如果从上面的代码段中删除setContentView方法,则片段会显示数据。关于为什么这是一个问题的任何想法?谢谢!

编辑:这是片段中的静态newInstance方法

public static DetailActivityFragment newInstance(String id) {
    DetailActivityFragment fragment = new DetailActivityFragment();
    Bundle args = new Bundle();
    args.putString(Intent.EXTRA_TEXT, id);
    fragment.setArguments(args);
    return fragment;
}

这是布局activity_detail的片段:

<fragment android:name="app.appone.DetailActivityFragment"
android:id="@+id/fragment_detail"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

4 个答案:

答案 0 :(得分:5)

您必须将数据传递给您的片段。

在片段上创建静态方法以进行实例创建。它应该是这样的:

public static newInstance(Object param) {
  DetailActivityFragment yourFragment = new DetailActivityFragment();
  Bundle args = new Bundle();
  args.put(key, value);
  yourFragment.setArguments(args);
  return yourFragment;
}

在片段的onCreate方法中,您可以使用方法“getArguments();

获取该数据

您的活动代码没问题。但我更喜欢使用“替换”而不是“添加”方法。

答案 1 :(得分:2)

您的最新编辑显示您在layout xml中使用静态片段,但动态创建它。在xml文件中创建一个静态片段:

<fragment android:name="app.appone.DetailActivityFragment"
    android:id="@+id/fragment_detail"
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

在代码中使用FragmentManager生成动态片段。调用setContentView()会导致冲突是有道理的,因为您使用FragmentManager创建的片段将被您在xml文件中定义的片段替换。 xml中的那个与动态片段不同,没有参数,这就是它返回null的原因。

在使用android.R.id.content时,您可以完全从xml中删除此静态片段。将其替换为空布局,例如FrameLayout,并设置id属性。然后,在使用FragmentManager时,请将此android.R.id.content替换为id

例如:

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

Activity文件中:

DetailActivityFragment frag = (DetailActivityFragment) getSupportFragmentManager().findFragmentById(R.id.frag_container);
if (frag == null) {
    frag = DetailActivityFragment.newInstance(id);
    getSupportFragmentManager()
        .beingTransaction()
        .add(R.id.frag_container, frag)
        .commit();
}

答案 2 :(得分:1)

感谢您的编辑。我认为您使用错误的ID替换片段。

与之前的评论一样,您应首先设置内容视图。您的布局文件应该有一个占位符视图,例如FrameLayout里。为您的布局指定一个ID,并在替换代码中引用此ID。

你的“R.layout.activity_detail”应该有一个这样的布局代码段:

<FrameLayout id="+@id/my_detail_frag"/>

您的活动代码应如下所示:

getSupportFragmentManager().beginTransaction().add(R.id.my_detail_frag,detailFrag).commit();

答案 3 :(得分:0)

这个答案可以帮到你:

Best practice for instantiating a new Android Fragment

你应该使用setArguments()和getArguments()将Bundle传递给Fragment。

祝你好运!