如果动态添加,如何在片段Activity中初始化片段?

How to initiate fragment in fragmentActivity if it is added dynamically?

我有一个 FragmentActivity,我在其中实现导航抽屉,就像我 select 抽屉列表中的任何项目然后它的片段在 activity 中打开一样。现在我的 XML 显示片段的布局代码如下所示

<!-- Framelayout to display Fragments -->
    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        />

这意味着我在 xml 文件中没有任何片段标签,但我从 activity 动态打开片段,如下所示

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 使一个片段的片段状态在定向 changed.so 时保持活动状态,我在 FragmentActivity 的 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 frRandomFragment是我在homeFragment AsyncTaskclass的onPostExecute方法中调用的片段。我不知道 RandomFragment 的启动是否正确,即 fr = new RandomFragment();

因为我的 activity 布局文件中没有片段标签,所以我不知道如何通过 ID 或标签查找片段。我只有一个扩展片段 classes 的片段,我像上面那样称呼它们。我在这里很困惑。我收到错误

02-28 16:28:37.809: E/AndroidRuntime(4336): java.lang.IllegalStateException: Fragment RandomFragment{4247d248} is not currently in the FragmentManager

当我尝试将方向更改为横向时。我在 putFragment 行中收到此错误。在 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 方法做任何事情。

您似乎在尝试将片段的全新实例放入片段管理器中。这不仅会导致您看到的问题,如果它有效,您就不会恢复该片段的实例状态。尝试使用片段管理器查找当前片段。

@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);
}