'片段已经活跃'当setArguments()为片段时

时间:2015-03-22 11:54:06

标签: android android-fragments android-activity

我有Activity,其中包含Fragment

Activity布局文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment class="com.my.ContentFragment"
        android:id="@+id/fragment_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

Activity的Java代码:

import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;

public class ContentActivity extends ActionBarActivity {

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

            setContentView(R.layout.activity_main);

            //data from  previous Activity
            Bundle data = getIntent().getExtras();

            Fragment contentFragment = getSupportFragmentManager()
                                                    .findFragmentById(R.id.fragment_content);

            // Pass data to fragment
            /*java.lang.IllegalStateException: Fragment already active*/
            contentFragment.setArguments(data);
        }
...   
}

我尝试在Activity的onCreate()中找到该片段,然后将一些数据传递给它。但是当我contentFragment.setArguments(data);时,我会得到java.lang.IllegalStateException: Fragment already active

然后我还检查了contentFragment.getArguments()为空。那么,为什么我不能为我的片段设置参数呢?

如果无法以这种方式将bundle传递给片段,我怎样才能将bundle传递给片段?

2 个答案:

答案 0 :(得分:2)

Arguments通常在Fragment.onCreate()中读取。如果从xml布局中填充片段,则片段已经通过FragmentManager添加到活动中,并且不再接受参数。

如果片段需要参数,最好以编程方式将其添加到FragmentManager而不是使用xml方式。我建议您查看this doc,其中解释了正确的片段生命周期以及如何正确地将此片段附加到活动中。

顺便说一下。你可能会发现FragmentArgs很有用。

答案 1 :(得分:0)

只需在xml文件中使用FrameLayout而不是片段标记。 然后,只需在活动的Fragment中创建新的onCreate()对象[上方],然后致电fragment.setArguments(Bundle);

在Fragment类的onCreate()内,调用getArguments(),它将返回Bundle

将捆绑传递给Fragment是最好的方法。