我正在学习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"/>
答案 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。
祝你好运!