我在ViewPager
中有5个片段,用于用几个字段逐步填充业务对象,在每个步骤中,将设置其中一些字段。我已经阅读了许多有关片段之间交流的文章,但我对别人的喜好感到不舒服,因此在考虑我应该如何做到这一点之后,我最终开始考虑使用Singleton模型对象,所有片段都可以轻松访问这些对象到它的字段并以特定的步骤填充它们。
我是Android的新手,我想从专家那里听到有关使用Singleton的信息,而不是在诸如实现界面之类的片段之间传递数据(似乎如此复杂且难以维护)。任何建议都会有所帮助。
,而辛格尔顿的方法似乎很容易实施,并且理解这是实现所需物品的最佳方法。原因之一是您的模型对象或称其为业务对象属于活动的上下文之外,这可能会很难找到错误。例如。如果您的活动类的多个实例是由系统创建的,并且都会引用您的单例。看看您如何失去对象的跟踪?
我要做的是
- 使我的模型对象实现
Parcelable
您一开始会讨厌它,但是一旦使用它,它将成为您模型的最好的朋友 - 由于您的模型是
parcelable
,现在您可以在片段,活动之间轻松地将其传递,甚至可以将其保存在共享的偏好中。在片段或活动之间传递parcelable
时要注意的一件事要注意,它就像通过值,即每次创建新实例时。 -
设置片段的论点,或者如果已经实例化,请获取参数并添加模型。这是一个示例:如果片段尚未活跃:
Bundle args = new Bundle(); args.putParcable("businessObject", yourBusinessObjectThatIsParcable); yourFragment.setArguments(args);
否则:
yourFragment.getArguments().putParcelable("businessObject", yourBusinessObjectThatIsParcable);
-
在您的片段中,也许在OnCreateview方法中获取像This
MyParcableObject mpo = (MyParcableObject)getArguments().getParcelable("businessObject")
的模型对象,并使用它设置您想要的任何数据。 -
完成对象在按钮上进行编辑后,请单击按钮或在Onpause方法中更新片段的参数相同的方式
getArguments().putParcelable("businessObject", mpo);
-
在您的最后一页或最后一个片段中,您可以将对象传递给您的活动,这是如何做
即使看起来很麻烦,但这是您需要习惯的习惯。当您的模型实现parcelable
时,您将获得更多的控制。
另一种做您需要的方法是通过委托模式,但是即使您也可以通过对象也可以用于回调。
i不推荐全球单身人士。有两个主要原因:
- 根据定义,单例将您的应用程序限制为主要业务对象的单个实例。如果您(或设计师,或您的老板的老板)决定一次拥有这些视图的多个,则无论如何您都必须更改您的体系结构。
- " Android思维方式"是期望您的用户可以将您的应用程序放在后台,并在返回应用程序之前使用其他应用程序。如果系统决定在后台杀死您的应用程序,则您的单例内存对象将被破坏,您的用户将失去所有进度。保存状态的正确方法是将状态保存在活动或片段中,将其适当地保存在
onSaveInstanceState()
中,并将其恢复在onCreate()
中。
ViewPager中的所有片段都可以通过呼叫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);
}
}
}
-
您可以将数据保存在活动的onsaveinstancestate()事件中,以防您的过程进入后台。您可以使用bundle and getextras()。
-
您可以将数据保存在应用程序类中,如果您的过程将进入后台,则数据仍然存在。
我更喜欢第一个选项,因为您不想在应用程序类中使用不同的活动和片段中的所有数据弄乱。我希望我能提供帮助:)
您是否结帐了EventBus?
我不确定这是否是最好的方法,特别是当您的问题太广泛时,只有5个片段会很酷。
希望它有帮助
我想在您的主activity中有一个ViewPager
,而FragmentOne
将是View Pager内部的片段之一。在这里,主要目的是向片段传达以刷新适配器。希望很清楚。
在您的主activity中添加此接口:
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");
}
}
...
}
首先加载片段时,从主动级调用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
,但是它很难维护(正如您所说的是Android中的新手)。您可以使用
- 数据库 - 在要存储维护多个记录时使用,但是您必须创建一个数据库getter/setter或使用任何ORM,例如Rushorm等。
-
SharefPreference
(最好是) - 如果要使用单个值。
在这两种情况下,您都将创建一个单元对象并在片段中访问其属性。
使您的对象可包裹,然后将其传递给其他片段使用捆绑包。即捆绑包。Putparcelable(OBJ)装饰非常有效且快速。
它应该激励您
http://www.developererphil.com/parcelable-vs-serializable/