片段之间的通信
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
我正在创建一个应用程序,我对如何在片段之间进行通信有疑问,我知道我必须与父级进行通信 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