如何将数据从当前片段传递到上一个片段

7

我需要翻译的内容是:我有两个Fragments,分别为A和B。我正在从Fragment A启动Fragment B。在关闭Fragment B之前,我需要将数据从Fragment B传递到Fragment A。这就像使用startActivityForResult()的想法。

在这里,我在Fragment A中调用Fragment B

 FragmentB calendarDialog = new FragmentB();
                calendarDialog.setTargetFragment(CurrentPanchangDialog.this, 1);
                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left);
                transaction.add(android.R.id.content, calendarDialog).addToBackStack(null).commit();

现在,在关闭 Fragment B 时,我会像这样调用一些东西:
getTargetFragment().onActivityResult(
                    getTargetRequestCode(),
                    Activity.RESULT_OK,
                    new Intent().putExtra("data", "datafrom C")
            );
            getActivity().getSupportFragmentManager().popBackStackImmediate();

现在,在基本活动中,我正在重写 onActivityForResult() 方法:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Fragment pFragment = getSupportFragmentManager().findFragmentById(R.id.content);
        if (pFragment instanceof CurrentPanchangDialog) {
            if (pFragment != null) {
                pFragment.onActivityResult(requestCode, resultCode, data);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

我无法从Fragment B将数据传回到Fragment A。
2个回答

7

这种方法也称为Delegate模式

• 创建一个包含一个如下所示方法的接口:

public interface FragmentCallback {
    void onDataSent(String yourData);
}

• 在FragmentA中实现此接口并实现onDataSent()方法:
public class FragmentA implements FragmentCallback {

    @Override
    void onDataSent(String yourData){
        //Do something with your data
    }
}

• 在Fragment B中声明此接口变量并创建公共的setter方法:
public class FragmentB {

private FragmentCallback fragmentCallback;

    public void setFragmentCallback(FragmentCallback callback) {
        this.fragmentCallback = callback;
    }
}

• 在FragmentA中的某个地方,将其设置为FragmentB实例的回调:

fragmentB.setFragmentCallback(this);

• 从FragmentB到FragmentA的路径数据(如果在FragmentB关闭时应发送数据,则可以在其中一个fragment生命周期方法中执行):

public class FragmentB {

    public void onDestroy() {
        if(fragmentCallback != null){
            fragmentCallback.onDataSent("Some data from FragmentB");
        }
        super.onDestroy();
    }
}

fragmentB.setFragmentCallback(this); 在 FragmentA 中哪里调用?请详细解释。 - sagar suri
在FragmentB之后,需要实例化FragmentB才能调用它。因此,在这一行之后,您可以在calendarDialog上调用它。 - dzikovskyy
我没有收到任何数据。在调用 popBackStackImmediate() 之前,我会调用 fragmentCallback.onDataSent("Some data from FragmentB") - sagar suri
没有看到你的代码很难说为什么它不起作用。确保一切都被正确实现——回调在FragmentA中被实现,但在FragmentB中声明并从FragmentB中调用。 - dzikovskyy
如果我如你所说从onDestroy()调用它,那么它可以正常工作。但是,如果我在getActivity().getSupportFragmentManager().popBackStackImmediate()之前调用它,则不会发送数据。 - sagar suri
太棒了!愉快地编程吧! - dzikovskyy

-1
你也可以在Activity中使用一个变量,然后从Fragment中访问它,可能像这样:
Activity:
private String data;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public String getData() {
    return this.data;
}

片段:

String dataFromActivity = ((YourActivity)getActivity).getData();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接