片段之间的通信

Comunicattion between fragments

我正在创建一个应用程序,我对如何在片段之间进行通信有疑问,我知道我必须与父级进行通信 activity 等等,我的问题更注重最佳实践。我的应用程序由一个带有导航抽屉的 MainActivity 组成,它根据选择调用一个片段并将其放在主屏幕上。 我有 2 个片段,需要通过一个按钮调用另一个片段(我可以毫无问题地将其转换为 activity),打开相机扫描条形码 (BarScanFragment) (https://github.com/dm77/barcodescanner)。

我的问题是可以知道哪个片段称为 BarScanFragment 以便我可以将参数发送到正确的片段,以及如何实现它。

BarScanFragment.java

public class BarScanFragment extends Fragment implements  ZXingScannerView.ResultHandler{
    private ZXingScannerView mScannerView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mScannerView = new ZXingScannerView(getActivity());
        return mScannerView;
    }

    @Override
    public void onResume() {
        super.onResume();
        mScannerView.setResultHandler(this);
        mScannerView.startCamera();
    }

    @Override
    public void onPause() {
        super.onPause();
        mScannerView.stopCamera();

    }

    @Override
    public void handleResult(Result result) {
        Log.i("TAG", result.getText());
        Bundle args = new Bundle();
        args.putString("barcodeScan", result.getText());
    }

FragmentA.java

…… ......

barcodeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment content = new BarScanFragment();
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.beginTransaction()
                        .replace(R.id.flFragmentContainer, content).addToBackStack("TRADEIN")
                        .commit();
                /*Intent intent = new Intent(rootView.getContext(), BarcodeScannerActivity.class);
                startActivity(intent);*/
            }
        });

片段b.java

.....
.....
 barcodeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Fragment content = new BarScanFragment();
                    FragmentManager fragmentManager = getFragmentManager();
                    fragmentManager.beginTransaction()
                            .replace(R.id.flFragmentContainer, content).addToBackStack("INFOPRODUCT")
                            .commit();
                    /*Intent intent = new Intent(rootView.getContext(), BarcodeScannerActivity.class);
                    startActivity(intent);*/
                }
            });

在您的 activity 中声明回调并使用这些回调从另一个片段调用方法

public interface Callback1 {
    void callbackMethod1();
}

public interface Callback2 {
    void callbackMethod2();
}

public class Activity extends ActionBarActivity implements Callback1, Callback2 {

    Fragment1 mFragment1;
    Fragment2 mFragment2;

    @Override
    public void callbackMethod1() {
        mFragment2.method2();
    }

    @Override
    public void callbackMethod2() {
        mFragment1.method1();
    }
}

public class Fragment1 extends Fragment {
    Callback1 callback;

    @Override
    public void onAttach(android.app.Activity activity) {
        super.onAttach(activity);
        callback = (Callback1) getActivity();
    }

    void callMethodOfFragment1() {
        callback.callbackMethod1();
    }

    @Override
    public void onDetach() {
        super.onDetach();
        callback = null;
    }

    public void method1() {
        do_sth_in_fr2();
    }
}

public class Fragment2 extends Fragment {
    Callback2 callback;

    @Override
    public void onAttach(android.app.Activity activity) {
        super.onAttach(activity);
        callback = (Callback2) getActivity();
    }

    void callMethodOfFragment2() {
        callback.callbackMethod2();
    }

    @Override
    public void onDetach() {
        super.onDetach();
        callback = null;
    }

    public void method2() {
        do_sth_in_fr1();
    }
}

您可以向 BarScanFragment 的构造函数添加一个参数:

public BarScanFragment(int creatorFragment) {
    // Do something with creatorFragment
}

将 "creatorFragment" 值保存到 activity:

public static final int FRAGMENT_1 = 0;
public static final int FRAGMENT_2 = 1;

然后在您的按钮侦听器中创建具有特定值的 BarScanFragment:

Fragment content = new BarScanFragment(MainActivity.FRAGMENT_1);

Fragment content = new BarScanFragment(MainActivity.FRAGMENT_2);

看看setTargetFragment and getTargetFragment。这是片段之间来回通信的最简单方法。 这里有一个小例子https://github.com/alexfu/TargetFragmentExample