我有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传递给片段?
答案 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
是最好的方法。