决定重写这个问题:
我有三个片段,称为 A B C。每个片段都有一个视图,其中包含一些字段供用户填写。用户应该能够使用菜单在不同的片段之间切换。如果用户在片段 A 中填写信息,然后切换到 C 填写更多信息,然后切换回 A,则用户在 A 中键入的信息应该仍然存在。
我认为我需要以某种方式使用 FragmentManager,但我无法找出添加/替换/附加的正确组合......这是使其按照我想要的方式工作所需的。
有人可以提供一个代码片段,允许我在片段之间切换,同时维护每个片段的视图状态。
当前工作解决方案:
mContent是活动片段,是活动的私有成员变量。
如果有人发现这种方法有问题或有一种方法可以使其更高效/更强大,请告诉我!
public void switchContent(String fragmentTag) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if ( fragmentManager.findFragmentByTag( fragmentTag ) != mContent ) {
if ( !mContent.isDetached() ) {
transaction.detach( mContent );
}
if ( fragmentManager.findFragmentByTag( fragmentTag ) == null ) {
if ( fragmentTag.equals( "details" ) ) {
mContent = ScheduleDetailsFragment.newInstance();
} else if ( fragmentTag.equals( "notes" ) ) {
mContent = ScheduleNotesFragment.newInstance();
} else if ( fragmentTag.equals( "exceptions" ) ) {
// @TODO - Create Exceptions Fragment
}
} else {
mContent = ( SherlockFragment ) fragmentManager.findFragmentByTag( fragmentTag );
}
if ( mContent.isDetached() ) {
transaction.attach( mContent );
} else if ( !mContent.isAdded() ) {
transaction.add( R.id.content_frame, mContent, fragmentTag );
}
transaction.commit();
}
getSlidingMenu().showContent();
}
谢谢你,
内森
我基于所提供的示例之一的代码,但每次单击菜单项时它都会返回一个新片段,因此状态信息会丢失。
如果您的页面保留某种形式的状态/会话,则返回一个新的Fragment
对于每个导航事件来说,用户体验都很差,而且内存使用情况也不太好。
我建议您的滑动菜单使用FragmentManager
在你的主要Activity
来维持你的一切Fragments
您可以在之间切换。它将管理它们的所有状态,您可以使用findFragmentByTag(String tag)
。您只需要确保每个Fragment
保存您添加的任何状态(初始创建后更改的值/数据)onSaveInstanceState(Bundle outState)
并恢复它onCreate(Bundle savedInstanceState)
。我不确定您当前使用的滑动菜单如何管理它,所以这可能是不可能的。希望这至少可以帮助您朝着正确的方向前进。
编辑:更新问题的更新答案 -这是我将如何切换Fragments
。通过使用替换,您将完全切换Fragments
,同时重用已经创建的。为了让您的片段保存/恢复其状态,您需要参考我上面的答案。如果不清楚,请搜索一些如何保存状态的示例Fragments
and Activities
.
public void switchContent(String fragmentTag) {
// If our current fragment is null, or the new fragment is different, we need to change our current fragment
if (mContent == null || !mContent.getTag().equals(fragmentTag)) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
// Try to find the fragment we are switching to
Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag);
// If the new fragment can't be found in the manager, create a new one
if (fragment == null) {
if (fragmentTag.equals("details")) {
mContent = ScheduleDetailsFragment.newInstance();
}
else if (fragmentTag.equals("notes")) {
mContent = ScheduleNotesFragment.newInstance();
}
else if (fragmentTag.equals("exceptions")) {
// @TODO - Create Exceptions Fragment
}
}
// Otherwise, we found our fragment in the manager, so we will reuse it
else {
mContent = (SherlockFragment) fragment;
}
// Replace our current fragment with the one we are changing to
transaction.replace(R.id.content_frame, mContent, fragmentTag);
transaction.commit();
getSlidingMenu().showContent();
}
else {
// Do nothing since we are already on the fragment being changed to
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)