Android 无法通过捆绑将数据传递到片段
我正在学习安卓基础知识,在创建第一个应用程序时遇到了这个问题。我有一个将数据传递给片段的活动。活动的Android 无法通过捆绑将数据传递到片段,android,android-fragments,Android,Android Fragments,我正在学习安卓基础知识,在创建第一个应用程序时遇到了这个问题。我有一个将数据传递给片段的活动。活动的OnCreate方法有如下块: if(savedInstanceState == null){ DetailActivityFragment detailFrag = DetailActivityFragment.newInstance(movieId); getSupportFragmentManager().beginTransaction().add(
OnCreate
方法有如下块:
if(savedInstanceState == null){
DetailActivityFragment detailFrag = DetailActivityFragment.newInstance(movieId);
getSupportFragmentManager().beginTransaction().add(android.R.id.content,detailFrag).commit();
}
setContentView(R.layout.activity_detail);
public static newInstance(Object param) {
DetailActivityFragment yourFragment = new DetailActivityFragment();
Bundle args = new Bundle();
args.put(key, value);
yourFragment.setArguments(args);
return yourFragment;
}
<FrameLayout id="+@id/my_detail_frag"/>
如果执行getParameters()
,则在片段(活动\u详细信息)处收到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;
}
以下是我在布局活动_细节中的片段:
<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"/>
您必须将数据传递给片段 在片段上创建静态方法以创建实例。应该是这样的:
if(savedInstanceState == null){
DetailActivityFragment detailFrag = DetailActivityFragment.newInstance(movieId);
getSupportFragmentManager().beginTransaction().add(android.R.id.content,detailFrag).commit();
}
setContentView(R.layout.activity_detail);
public static newInstance(Object param) {
DetailActivityFragment yourFragment = new DetailActivityFragment();
Bundle args = new Bundle();
args.put(key, value);
yourFragment.setArguments(args);
return yourFragment;
}
<FrameLayout id="+@id/my_detail_frag"/>
在片段的onCreate方法中,可以使用方法“getArguments()”获取数据
您的活动代码还可以。但我更喜欢使用“替换”而不是“添加”方法。这个答案可以帮您解决问题: 应该使用setArguments()和getArguments()将包传递到片段中
祝你好运!谢谢你的编辑。我认为你使用错误的id替换碎片 与前面的注释一样,您应首先设置内容视图。布局文件应具有占位符视图,例如Framelayout。为布局指定一个id,并在替换代码中引用此id 您的“R.layout.activity_detail”应该有如下布局片段:
if(savedInstanceState == null){
DetailActivityFragment detailFrag = DetailActivityFragment.newInstance(movieId);
getSupportFragmentManager().beginTransaction().add(android.R.id.content,detailFrag).commit();
}
setContentView(R.layout.activity_detail);
public static newInstance(Object param) {
DetailActivityFragment yourFragment = new DetailActivityFragment();
Bundle args = new Bundle();
args.put(key, value);
yourFragment.setArguments(args);
return yourFragment;
}
<FrameLayout id="+@id/my_detail_frag"/>
您最近的编辑显示您正在
布局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"/>
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();
}
在您的活动
文件中:
<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"/>
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();
}
请调用setContentView(R.layout.activity_detail);上面的片段声明这是我第一次想到的。这不起作用。查看
newInstance()
方法的代码会有帮助,只是为了确保对新片段正确调用setArguments()
。添加了我的newInstance()
问题中的方法啊……您的编辑显示了问题所在。您使用的是静态片段,但动态创建它!删除xml
中的
元素,并将其替换为类似于FrameLayout
的内容来保存片段。我已经完全做到了。我已经创建了newInstance
方法在我执行的片段中,setArguments()
。getArguments()
是在片段的OnCreate内部执行的。您写道,您执行getParameters('如果执行getParameters(),则执行片段(活动\详细信息)'))你能从onCreate内部粘贴代码吗?我有一个设置参数的静态newInstance
方法。看看我的编辑。这也不起作用。android.R.id.content不应该也使用片段吗?这个id是根视图。我认为你不应该使用它。你能发布你的布局文件吗?是吗获取fragments onCreate方法中的参数?onCreate方法是否被调用?发布您迄今为止更改的所有内容。不确定您为什么会获得否决票。我已发布版面中的片段。感谢您的帮助!非常好的捕获!我完全忽略了Framelayout。我刚刚测试了更改,效果非常好。它还为我提供了请原谅阅读更多关于框架布局的内容。谢谢!@shark1608不客气!FWIW,我建议您也研究一下静态和动态片段之间的区别。我(我相信大多数人)只能使用动态片段,因为它们更灵活,这可能就是为什么这个解决方案可能不那么明显的原因。@shark1608我不知道你的意思。你想在哪里使用findViewbyId()
还有什么目的?或多或少我发布了:)我的建议是去掉布局文件中的,而使用占位符。因此我不需要findById方法:)