pat*_*ats 0 android android-fragments
我想在活动和片段以及片段和片段之间传递一个复杂的对象.目前,主活动创建一个片段输入对象,并将其设置为需要打开的片段的成员.类似地,当另一个片段想要加载另一个片段时,它会创建片段输入并通知主要活动.请参阅下面的主要和子片段代码.我的问题是,这是正确的实施.有时我在子活动中遇到输入为null,如果活动暂停并重新启动.
请告诉我我做错了什么,是传递数据的最佳方式.
public class FragmentInput {
public String url = "";
public String title = "";
public String time = "";
... other memebers
}
Run Code Online (Sandbox Code Playgroud)
主要活动
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();
}
}
Run Code Online (Sandbox Code Playgroud)
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);**
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的片段附加到相同的活动,您可以将对象存储在活动中并访问对象,如下所示:
((YourActivity)getActivity()).getYourObjects();
Run Code Online (Sandbox Code Playgroud)
如果你在你的活动中将你的对象存储在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/
| 归档时间: |
|
| 查看次数: |
8206 次 |
| 最近记录: |