Android ViewPager中多个片段之间的通信对象
我在Android ViewPager中多个片段之间的通信对象,android,android-fragments,android-viewpager,singleton,Android,Android Fragments,Android Viewpager,Singleton,我在ViewPager中有5个片段,用于一步一步地用几个字段填充业务对象,在每个步骤中都会设置一些字段。我读过很多关于片段间通信的文章,但我对其他人喜欢的方式感到不舒服,所以在考虑了我应该如何在我的案例中做到这一点之后,最后我开始考虑使用singleton模型对象,所有片段都可以轻松访问其字段,并在特定步骤中填充它们 由于我是android新手,我想听听专家们关于使用singleton而不是在片段之间传递数据的意见,比如实现的接口(它看起来很复杂,很难维护)。任何建议都会有帮助。我想在您的主要活
ViewPager
中有5个片段,用于一步一步地用几个字段填充业务对象,在每个步骤中都会设置一些字段。我读过很多关于片段间通信的文章,但我对其他人喜欢的方式感到不舒服,所以在考虑了我应该如何在我的案例中做到这一点之后,最后我开始考虑使用singleton模型对象,所有片段都可以轻松访问其字段,并在特定步骤中填充它们
由于我是android新手,我想听听专家们关于使用singleton而不是在片段之间传递数据的意见,比如实现的接口(它看起来很复杂,很难维护)。任何建议都会有帮助。我想在您的主要活动中有一个
ViewPager
,而FragmentOne
将是ViewPager中的一个片段。这里,MainActivity正在与FragmentOne通信以刷新其适配器。希望是明确的
在MainActivity中添加此界面:
public interface Updateable {
public void update();
}
在需要更新的片段中实现此接口,并在update
方法中编写代码以通知适配器:
public class FragmentOne extends Fragment implements MainActivity.Updateable {
...
@Override
public void update() {
// YOUR CODE TO UPDATE HERE, FOR EXAMPLE, HERE I'M UPDATING THE ADAPTER
if ( adapter != null ) {
adapter.notifyDataSetChanged();
} else {
Log.d("LOG_TAG", "null");
}
}
...
}
当片段第一次加载时,从main活动调用update
方法。您可以覆盖PagerAdapter
中的getItemPosition
方法来执行此操作,如下所示:
@Override
public int getItemPosition(Object object) {
if ( object != null && object instanceof FragmentOne ) {
FragmentOne f = (FragmentOne) object;
f.update();
}
return super.getItemPosition(object);
}
最后,必须调用viewPager适配器的notifyDataSetChanged()。这将强制viewpager的适配器调用getItemPosition方法
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
int previousState;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
if (previousState == ViewPager.SCROLL_STATE_SETTLING && state == ViewPager.SCROLL_STATE_IDLE) {
if ( viewPagerAdapter.getItem(viewpager.getCurrentItem()) instanceof Pictures ) {
Log.d("LOG_TAG", "New Position=" + viewpager.getCurrentItem());
viewPagerAdapter.notifyDataSetChanged();
}
}
previousState = state;
}
});
我不推荐全球单身人士。主要原因有两个:
onSaveInstanceState()
中,然后在onCreate()
中恢复状态getActivity()
获得对父活动的引用。或者,如果ViewPager位于片段中,则所有片段都可以通过调用getParentFragment()
访问父片段。然后,您可以将结果强制转换到适当的类(或者更好的接口),并进行方法调用以来回传递数据。跟踪父活动/片段中的业务数据。这样,您就不需要一个全局单例
比如说,
public class MyParentFragment extends Fragment {
private String mPageOneData;
private int mPageTwoData;
private List<Date> mPageThreeData;
public void setPageOneData(String data) {
mPageOneData = data;
}
...
}
public class PageOneFragment extends Fragment {
private void sendDataToParent(String data) {
Fragment f = getParentFragment();
if (f != null && f instanceof MyParentFragment) {
MyParentFragment parent = (MyParentFragment) f;
f.setPageOneData(data);
}
}
}
公共类MyParentFragment扩展了片段{
私有字符串mPageOneData;
私有数据;
私人名单mPageThreeData;
public void setPageOneData(字符串数据){
mPageOneData=数据;
}
...
}
公共类PageOneFragment扩展了该片段{
私有void sendDataToParent(字符串数据){
片段f=getParentFragment();
如果(f!=null&&f MyParentFragment的instanceof){
MyParentFragment父项=(MyParentFragment)f;
f、 setPageOneData(数据);
}
}
}
在选择任何选项之前,请记住用户可以导航或打开任何其他应用程序,这样您就丢失了数据
您可以在SaveInstanceState上使用onSaveInstanceState
,但它在某种程度上难以维护(正如您所说,您是android新手)。您可以使用
- 数据库-当您希望存储和维护多个记录,但必须创建数据库getter/setter或使用任何ORM(如RushOrm等)时使用
(最好)-如果要使用单个值共享fpreference
希望它能有所帮助,而单例方法似乎很容易实现和理解,它并不是实现您所需的最佳方法。一个原因是,您的模型对象或您称之为业务对象的对象存在于活动的上下文之外,这可能会产生难以发现的bug。例如,当系统创建了多个activity类实例,并且两个实例都引用了您的singleton时。看看你是如何失去对物体的跟踪的 我要做的是
parcelable
时,这里需要注意的一点很重要,它就像传递值一样,即每次创建新实例时。Bundle