我想在活动和片段以及片段和片段之间传递一个复杂的对象。目前,主活动创建一个片段输入对象,并将其设置为需要打开的片段的成员。类似地,当另一个片段想要加载另一个片段时,它会创建片段输入并通知主要活动。请参阅下面的主要和子片段代码。我的问题是,这是正确的实施。有时我在子活动中遇到输入为null,如果活动暂停并重新启动。
请告诉我我做错了什么,最好的方法是传递数据。
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();
}
}
ChildFragment
@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);**
}
}
答案 0 :(得分:6)
如果您的片段附加到同一活动,您可以将对象存储在活动中并访问以下对象:
((YourActivity)getActivity()).getYourObjects();
如果你在你的活动中将你的对象存储在bundle中,我建议你调用我在片段的onActivityCreated()方法中给出的代码示例,以避免空指针异常。
如果要在bundle中的活动或片段之间传递对象。您应该将Parcelable实现为对象并传递它们。
什么是Parcelable? http://developer.android.com/reference/android/os/Parcelable.html
Parcelable效率更高但您可以查看Serializable: http://developer.android.com/reference/java/io/Serializable.html
在bundle中传递大型对象并不是一个好的设计。
此外,您可以使用接口传递对象,也可以使用总线事件传递它们。你可以检查番石榴或奥托布斯。 http://square.github.io/otto/
答案 1 :(得分:2)
在这种情况下,您可以使用静态持有者(它有点类似于单例模式)。
创建一个新类
public class Holder
{
private static FragmentInput input = null;
public static void setInput(FragmentInput value) { this.input = value; }
public static FragmentInput getInput() { return input; }
}
在主活动中,创建新的FragmentInput对象后 把它放在持有人身上
Holder.setInput(input);
您可以随时随地访问它,只需致电
FragmentInput myInput = Holder.getInput();