如果动态添加片段活动,如何在片段活动中启动片段?

时间:2015-02-28 11:29:58

标签: java android android-layout android-fragments

我有一个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片段方法做任何事情。

1 个答案:

答案 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);
}