我有一个FragmentActivity
我正在实现导航抽屉,就像我从抽屉列表中选择任何项目然后它的片段在活动中打开一样。现在我显示片段的XML布局代码如下所示
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
这意味着我在xml文件中没有任何片段标签,但是我从活动中动态打开片段,如下所示
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
if(session.isLoggedIn())
{
fragment = new SlidingFragment();
}
else
{
fragment = new LoginFragment();
}
break;
case 1:
fragment = new HomeFragment();
break;
case 2:
fragment = new LoginFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();}
现在我想使用putFragment在方向改变时保持一个片段的片段状态。所以,我在下面的FragmentActivity&#39; s onSaveInstanceState
方法编码
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Log.v(TAG, "In frag's on save instance state ");
FragmentManager manager = getSupportFragmentManager();
fr = new RandomFragment();
manager.putFragment(outState, "randomFragment", fr);
}
此处fr
是全局声明的片段Fragment fr
的实例,而RandomFragment
是我在homeFragment AsyncTask类的onPostExecute方法中调用的片段。我不知道RandomFragment的启动是正确与否是fr = new RandomFragment();
因为我不知道如何通过id或tag找到片段,因为我的活动布局文件中没有片段标记。我只有一个扩展Fragment的片段类,我就像上面那样调用它们。我在这里很困惑。我收到了错误
02-28 16:28:37.809: E/AndroidRuntime(4336): java.lang.IllegalStateException: Fragment RandomFragment{4247d248} is not currently in the FragmentManager
当我尝试将方向更改为横向时。我在putFragment Line中遇到了这个错误。在onRestoreInstanceState方法中,我为getFragment
编写代码@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction t = manager.beginTransaction();
if(savedInstanceState != null)
{
fr = (FragmentRandom)manager.getFragment(savedInstanceState, "randomFragment");
}
else
{
fr = new FragmentRandom();
}
t.add(fr, "randomFragment");
t.commit();
}
但是当onSaveInstanceState
上的putFragment执行时,我收到错误并且我的应用程序强行停止,因此onRestoreInstanceState
没有执行。
我的实际问题是我不知道我是否以正确的方式发起片段。如果它是正确的,为什么我得到错误?我是否还必须使用onSaveInstanceState
片段方法做任何事情。
答案 0 :(得分:0)
您似乎试图将片段的全新实例放入片段管理器中。这不仅会导致您看到的问题,如果它已经工作,您将不会恢复该片段的实例状态。尝试使用片段管理器找到当前片段。
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
FragmentManager manager = getSupportFragmentManager();
Fragment fr = manager.findFragmentById(R.id.frame_container);
manager.putFragment(outState, "randomFragment", fr);
}