Fragment间数据的传递,是通过setArguments()和getArguments()这两个方法来进行实现
传递数据
Bundle bundle = new Bundle();
bundle.putString("DataTransferFragment", "DataTransferInDifferentFragment");
DataTransferFragment fragment = DataTransferFragment.newInstance(bundle);
fragment.show(getFragmentManager(),"DataTransferFragment");
接收数据
public class DataTransferFragment extends DialogFragment {
private AlertDialog dialog;
private String bundleString;
public static DataTransferFragment newInstance(Bundle bundle) {
DataTransferFragment fragment = new DataTransferFragment();
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle != null) {
bundleString = bundle.getString("DataTransferFragment");
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText(bundleString);
dialog = new AlertDialog.Builder(getActivity())
.setView(textView)
.create();
return dialog;
}
}
官方推荐Fragment与Activity之间数据传递的实现方式:接口回调
接口定义
/**
* 确认事件回调
*/
public interface OnConfirmClickListener {
public void onConfirmClick(String userName, String password);
}
public class TestDialogFragment extends DialogFragment {
private AlertDialog dialog;
private OnConfirmClickListener mListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mListener = (OnConfirmClickListener) context;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_test_dialog, null);
dialog = new AlertDialog.Builder(getActivity())
.setView(view)
.create();
Button cancel = (Button) view.findViewById(R.id.btn_cancel);
Button confirm = (Button) view.findViewById(R.id.btn_confirm);
final EditText mUserName = (EditText) view.findViewById(R.id.et_userName);
final EditText mPassword = (EditText) view.findViewById(R.id.et_password);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onConfirmClick(mUserName.getText().toString(), mPassword.getText().toString());
dialog.dismiss();
}
});
return dialog;
}
/**
* 确认事件回调
*/
public interface OnConfirmClickListener {
public void onConfirmClick(String userName, String password);
}
}
注意:上面代码中的onAttach()是关键点,在该方法中Fragment与Activity建立了关联关系
有这样一个应用场景,从FragmentA跳转到FragmentB中,FragmentB经过编辑后,修改了FragmentA中的数据,这种场景分为以下两种情况
FragmentA代码
public class ContentFragment extends Fragment {
public static final int REQUEST_CODE = 0x001;
public static final int RESULT_CODE = 0x101;
public static final String CONTENT_FRAGMENT = ContentFragment.class.getSimpleName();
private TextView content;
public static ContentFragment newInstance() {
return new ContentFragment();
}
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final EditFragment editFragment = EditFragment.newInstance();
View view = inflater.inflate(R.layout.fragment_content, container, false);
content = (TextView) view.findViewById(R.id.tv_content);
Button differentActivity = (Button) view.findViewById(R.id.btn_different_activity);
Button button = (Button) view.findViewById(R.id.btn_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//当一个Fragment启动另外一个Fragment时,setTargetFragment()设置该方法后,
//目标Fragment可以将数据回调到启动的Fragment
editFragment.setTargetFragment(ContentFragment.this, REQUEST_CODE);
getFragmentManager().beginTransaction()
.hide(ContentFragment.this)
.add(R.id.fl_container, editFragment, EditFragment.EDIT_FRAGMENT)
.addToBackStack(null)
.commit();
}
});
differentActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra(CONTENT_FRAGMENT, CONTENT_FRAGMENT);
getActivity().setResult(RESULT_CODE, intent);
getActivity().finish();
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) {
return;
}
String name = data.getStringExtra("name");
content.setText(name);
}
}
NOTE:
setTargetFragment();相当于一个路标,为返回的数据提供了方向;
onActivityResult()该方法与Activity中的onActivityResult()作用相同,都是用于接收返回的数据
FragmentB代码
public class EditFragment extends Fragment {
public static final String EDIT_FRAGMENT = EditFragment.class.getSimpleName();
public static final int RESPONSE_CODE = 0x010;
public static EditFragment newInstance() {
return new EditFragment();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_edit, container, false);
final EditText nameEditText = (EditText) view.findViewById(R.id.et_name);
Button commitButton = (Button) view.findViewById(R.id.btn_commit);
commitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
backResult(nameEditText.getText().toString());
}
});
return view;
}
private void backResult(String name) {
if (getTargetFragment() == null) {
return;
}
Intent intent = new Intent();
intent.putExtra("name", name);
getTargetFragment().onActivityResult(ContentFragment.REQUEST_CODE, RESPONSE_CODE, intent);
getFragmentManager().popBackStack();
}
}
NOTE:
在Activity中返回数据,需要调用setResult()方法,数据会自动返回;而Fragment中则需要调用onActivityResult()
该方式其实与Acitivity的数据回显相同,具体看代码
ActivityA中的FragmentA启动另外一个ActivityB
//不同的Activity内Fragment之间的数据回调
intent = new Intent(getActivity(), SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
ActivityB中FragmentB返回数据
differentActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra(CONTENT_FRAGMENT, CONTENT_FRAGMENT);
getActivity().setResult(RESULT_CODE, intent);
getActivity().finish();
}
});
FragmentA中接收数据
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == ContentFragment.RESULT_CODE && data != null) {
Log.i(MAIN_FRAGMENT, data.getStringExtra(ContentFragment.CONTENT_FRAGMENT));
}
}