cal*_*cat 7 android android-fragments
我有一个使用Fragments 的标签应用程序,还有一个小问题.
MainActivity(扩展FragmentActivity- 没有为布局规范保存代码)在其布局中onCreate包含一个Fragment被调用的TabsFragment(扩展Fragment,实现OnTabChangeListener)(将标签本身放在a中FrameLayout),Fragment使用Transactions 切换子.
后者Fragments是具有实际内容的子实体,当用户转动设备,访问另一个应用程序,接听电话或执行其他操作时,我希望保存该状态.目前,子节点的状态Fragment未保存,但活动会记住Fragment正在显示哪个子节点.(因此,如果我将设备置于横向模式并在标签3处于活动状态时转动设备,则标签3将以纵向模式显示,重置,但显示.因此,某些状态正在保留,而我没有做任何事情).
因为我有多个布局(横向和纵向),所以android:configChanges="orientation"在清单中不是一个选项 - 我不想使用它,因为它是一个美化的绑带.
我使用的是V4支持库(修订版10)和精练的API后,我遇到了FragmentManager.saveFragmentInstanceState()和Fragment.setInitialSavedState(Fragment f).我已经为Fragment重写onPause()方法中的每个子项设置了saveFragmentInstanceState()TabsFragment.我不确定这是否有效,因为无论我把setInitialSavedState它放在哪里,它都给出了IllegalStateException- 但即使我刚刚初始化了一个新的子Fragment标签,也会发生这种情况.它还崩溃,当我把它变成onResume在TabsFragment.
代码段:
//... this is the 'showTab' method
if(getFragmentManager().findFragmentByTag(id) == null)
{
Fragment f = null;
if(BASIC_TAB.equals(id))
{
f = new BasicTabFragment();
f.setInitialSavedState(basicState); // basicState was set in onPause()
getFragmentManager().beginTransaction().replace(tabNo, f, tabID).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
如果放入类似的代码onResume,我会收到以下错误:
错误代码段:(
Fragment例如,加载本地html页面或警报).我将使用Prevent WebView来显示"网页不可用",但没有任何成功.任何建议,将不胜感激.
小智 2
当 Activity 被销毁时,Fragment 会与 Activity 分离,并在重新创建时重新附加。因此,碎片应该仍然以其当前状态存在。当重新连接时,OnCreateView再次被调用。如果您像从头开始一样初始化所有内容(即将列表设置为new ArrayList()),您将清除片段的状态。
尝试在片段中为需要保留的所有内容创建一个实例变量(即任何文本字段的字符串 - EditText 字段将按照您提到的自动保存)。例子:
字符串文本;
文本查看电视;
public View onCreateView(LayoutInflater i, ViewGroup vg, Bundle b)
{
// 这将重新填充布局中的所有内容。如果您在此处初始化任何文本字段,它会将它们重置为您在 xml 文件中设置的值
查看 v = i.inflate(R.layout.myLayout, vg, false);
如果(文本!=空)
tv.setText(文本);
}
text当您的 TextView 值发生变化时(例如在 OnClickListener 或类似的情况下),除了您对其执行的其他操作之外,还请设置 的值。当片段被重新附加时,它会将其设置为最后一次所做的更改。
| 归档时间: |
|
| 查看次数: |
2585 次 |
| 最近记录: |