【发布时间】:2013-11-15 09:56:32
【问题描述】:
在开始之前,我已经浏览了以下问题:
Passing data between fragments: screen overlap How to pass values between Fragments
以及 Android 文档:
http://developer.android.com/training/basics/fragments/communicating.html
还有这篇文章:
http://manishkpr.webheavens.com/android-passing-data-between-fragments/
虽然上面提到的所有情况都与我的情况相似,但并不完全相同。我在这里遵循了一个很好的教程(我的部分代码基于这篇文章):
http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-views-1/
我有以下文件:
RegisterActivity.java
NonSwipeableViewPager.java
ScreenSliderAdapter.java
RegisterOneFragment.java
RegisterTwoFragment.java
还有以下布局:
activity_register.xml
fragment_register_one.xml
fragment_register_two.xml
我想要实现的是将一个 Serializable 对象从 RegisterFragmentOne 传递给 RegisterFragmentTwo。
到目前为止,这就是我所做的(省略了一些代码):
RegisterActivity.java
public class RegisterActivity extends FragmentActivity
implements RegisterOneFragment.OnEmailRegisteredListener{
public static NonSwipeableViewPager viewPager;
private ScreenSliderAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
// Initilization
mAdapter = new ScreenSliderAdapter(getSupportFragmentManager());
viewPager = (NonSwipeableViewPager) findViewById(R.id.pager);
viewPager.setAdapter(mAdapter);
}
public void onEmailRegistered(int position, Registration regData){
Bundle args = new Bundle();
args.putSerializable("regData", regData);
viewPager.setCurrentItem(position, true);
}
}
ScreenSliderAdapter.java
public class ScreenSliderAdapter extends FragmentPagerAdapter{
public ScreenSliderAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new RegisterOneFragment();
case 1:
return new RegisterTwoFragment();
case 2:
return new RegisterThreeFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
NonSwipeableViewPager.java(扩展 ViewPager 类,并覆盖以下内容)
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
RegisterOneFragment.java
public class RegisterOneFragment extends Fragment {
OnEmailRegisteredListener mCallBack;
public interface OnEmailRegisteredListener {
/** Called by RegisterOneFragment when an email is registered */
public void onEmailRegistered(int position, Registration regData);
}
public void onAttach(Activity activity){
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception.
try {
mCallBack = (OnEmailRegisteredListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnEmailRegisteredListener");
}
}
... And some to execute some HTTP request via separate thread...
}
我想要完成的是,当用户按下 RegisterOneFragment 上的按钮时,数据将被发送到服务器(并通过 JSON 返回一些验证)。如果返回的数据有效,应用程序应该转到下一个片段,即 RegistrationTwoFragment。
我对如何在片段之间传递对象有些困惑,因为我的片段是使用适配器创建的。然后将该适配器附加到我的 Activity。
谁能帮我解决这个问题?谢谢
编辑 1:
我试图像这样创建一个快捷方式(不幸的是它不起作用):
在我创建的 RegisterActivity 中:
public Registration regData;
在 RegisterOneFragment 中:
/* PLACED ON POST EXECUTE */
((RegisterActivity)getActivity()).regData = regData;
终于在RegisterTwoFragment中调用了
Registration regData;
regData = ((RegisterActivity) getActivity()).regData;
它抛出一个 nullPointerExceptions
编辑 2
需要明确的是,RegisterActivty 包含多个片段。用户可以在片段之间导航的唯一方法是单击按钮。 Activity 没有标签栏。
【问题讨论】:
标签: java android android-fragments