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方法:)