将数据从当前片段传回到先前的片段

chr*_*ris 15 android fragment android-fragments fragmentmanager

我在我的应用程序中使用导航抽屉.我有一个MainActivity,其余的是片段.所以问题是假设我有三个片段,如A,B,C.

现在在A我有一个按钮,我从A> B发送数据.
例如putSring("datafrom A","data from A");
现在在B中我从A接收数据.
我在B中有一个按钮,我从B> C发送数据.
例如putSring("datafrom B","data from B");
现在在C中我从B接收数据.
然后,我在C中有一个Button,并从C> B发送数据.
例如putSring("data from C","data from C");

所以,似乎在B中我从两个不同的片段获取数据.我尝试了所有使用活动,它与startActivityforresult配合得很好.但是,当所有碎片都是碎片时我怎么能管理.

Cod*_*lay 56

从B启动片段C时,可以调用setTargetFragment().示例:

FragmentC fragmentC = FragmentC.newInstance();
fragmentC.setTargetFragment(FragmentB.this, REQUEST_CODE);
getFragmentManager().beginTransaction().replace(R.id.container, fragmentC).commit();
Run Code Online (Sandbox Code Playgroud)

然后,当您想要将数据从C传递回片段B时,您可以调用以下代码:

getTargetFragment().onActivityResult(
                getTargetRequestCode(),
                Activity.RESULT_OK,
                new Intent().putExtra("datafrom C", "datafrom C")
);
Run Code Online (Sandbox Code Playgroud)

并从片段B中的onActivityResult()方法获取它:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode==REQUEST_CODE && resultCode==Activity.RESULT_OK) {
        String datafromC = data.getStringExtra("datafrom C");   
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这种简洁而朴素的方式.然而似乎很多人都没有意识到这一点 (4认同)
  • @KirillStarostin 手动调用**Activity**Result 到底有什么好处? (2认同)

Rav*_*aha 5

当您将数据从片段A发送到片段B时,请使用相同的布尔值,如下所示:

FragmentA-> FragmentB

FragmentB ldf = new FragmentB ();
Bundle args = new Bundle();
args.putBoolean("BOOLEAN_VALUE",true);
ldf.setArguments(args);

getFragmentManager().beginTransaction().add(R.id.container, ldf).commit();
Run Code Online (Sandbox Code Playgroud)

当您将数据从片段C发送到片段B时,请使用与片段A到B中相同的BOOLEAN,如下所示:

FragmentC-> FragmentB

FragmentB ldf = new FragmentB ();
    Bundle args = new Bundle();
    args.putBoolean("BOOLEAN_VALUE",false);
    ldf.setArguments(args);

    getFragmentManager().beginTransaction().add(R.id.container, ldf).commit();
Run Code Online (Sandbox Code Playgroud)

最后,我们必须检查FragmentB中的值是否从Fragment A或FragemntC之类的地方

片段B

   Boolean getValue= getArguments().getBoolean("BOOLEAN_VALUE");  
   if(getValue)
   {
    //VALUE RECEIVED FROM FRAGMENT A
   }
   else
   {
   //VALUE RECEIVED FROM FRAGMENT C
   }
Run Code Online (Sandbox Code Playgroud)