【发布时间】:2016-02-11 06:11:19
【问题描述】:
我想在活动和片段之间以及片段和片段之间传递一个复杂的对象。目前,主要活动创建一个片段输入对象并将其设置为需要打开的片段的成员。同样,当另一个片段想要加载另一个片段时,它会创建片段输入并通知主要活动。请参阅下面的主要和子片段代码。我的问题,这是正确的实现。如果活动暂停并重新启动,有时我在子活动中遇到输入为空。
请告诉我我做错了什么,传递数据的最佳方式是什么。
public class FragmentInput {
public String url = "";
public String title = "";
public String time = "";
... other memebers
}
主要活动
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
BaseFragment fragment = new LandingFragment();
**FragmentInput input = new FragmentInput();
input.stringinput = stringinput;
fragment.input = input;
fragmentTransaction.replace(R.id.fragment, fragment);
fragmentTransaction.commit();**
public void replaceFragment(BaseFragment fragment) {
if (fragment == null)
return;
if (fragment instanceof firstFragment) {
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.setCustomAnimations(0, 0);
fragmentManager.popBackStackImmediate(null,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
} else {
String ttag = fragment
.getClass().toString();
Fragment tempF = fragmentManager.findFragmentByTag(ttag);
if (tempF != null)
return;
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.fragment_enter,
R.anim.fragment_exit, R.anim.fragment_leftenter,
R.anim.fragment_leftexit);
fragmentTransaction.replace(R.id.fragment, fragment, ttag);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
子片段
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
try {
activity = getActivity();
resource = activity.getResources();
view = getView();
**if (input != null) {
String url= input.url;**
button.onclick(){
FragmentInput input = new FragmentInput();
input.url = path;
input.title = resource.getString(R.string.txt_from_gallery);
**BaseFragment fr = new otherFragment();
FragmentChangeListener fc = (FragmentChangeListener) getActivity();
fr.setInput(input);
fc.replaceFragment(fr);**
}
}
【问题讨论】:
-
什么时候传递值?
-
fragment.input = 输入;我设置了值并从其他片段中读取它,ChildFragment onclick 显示了我如何设置值并通知调用 replacefragment 方法来更改片段的主要活动