我在ViewPager中有FragmentX。 FragmentX里面有EditText,还有一个Button。用户按下Button,FragmentY替换FragmentX。然后用户按下并且FragmentX丢失了用户的所有输入。
你是怎么做的:
a)在FragmentY出现之前将数据保存在FragmentX中,然后FragmentY被FragmentX取代,检索数据并填入FragmentX中的EditText
(请不要回复OnSaveInstanceState,因为除非片段被销毁,否则这不起作用,在这种情况下它不会被破坏)
b)以某种方式将数据保存在FragmentX中,以便当我们从FragmentY返回FragmentX时它就在那里。
有什么建议吗?
答案 0 :(得分:0)
我建议遵循Google提供的指南并实现在Fragment中声明的接口,并保存Bundle或活动中您想要的任何对象。然后,在newInstace()静态工厂方法中传递Bundle并像往常一样重新创建数据。由于您使用的是ViewPager,并且在按下按钮之前它总是呈现第二个片段(我假设您的第二个片段在另一个选项卡中),您仍然需要通过界面来管理它。按下后退按钮时,数据仍将存在,除非它被销毁,您仍然需要实现onSaveInstaceState()
。您还可以使用setRetainInstance(boolean retain)。有关详细信息,请参阅here
答案 1 :(得分:0)
使用addToBackStack()可能对您的情况有所帮助。
如果从后向堆栈返回到片段,则不会重新创建片段,而是重新使用相同的实例,并在片段生命周期中以onCreateView()
开头,请参阅Fragment lifecycle。
因此,如果你想存储状态,你应该使用实例变量而不依赖于onSaveInstanceState()
。
答案 2 :(得分:0)
我现在将FragmentX中的数据保存到SharedPreferences并覆盖Activity中的onBackPressed,并在名为popFromBackstack的Activity中创建了一个函数,其中popBackStack()发生。
在我的Activity中的函数中,我替换了我的片段,我现在在替换之前将FragmentX中的数据保存到SharedPrefs中。如果新的Fragment是FragmentX,我也在检查后检查,如果是,我将从SharedPrefs将数据填充到FragmentX中。
我也在我的Activity中保存onBackPressed中FragmentX的数据(如果当前片段是FragmentX),请用户按下后退按钮。
我还在我的Activity中创建了一个名为popBackStack()的公共静态活动,我从Fragments调用它来弹出backstack。我也在这里保存FragmentX中的数据(如果弹出的当前片段是FragmentX)。弹出片段弹出后,我正在检查新片段是否为FragmentX,如果是,则填写数据......
长途跋涉,但我无法找出任何其他可靠的方法。这很完美。