片段android定向丢失片段

时间:2013-11-27 08:44:48

标签: android android-fragments android-orientation

我正在努力解决方向改变时的片段丢失问题。 起初,我的片段似乎对方向变化反应良好,没有任何错误。 但例外的是当我导航回先前制作的片段时。因为我正在我的fragmenthandler活动中检查它。

我选择使用大if语句而不是switch case,因为这更多地掌握在我的知识之内。 if语句的处理工作正常,一直用日志语句调试它,那里似乎没有任何错误。下面是处理片段的代码,预先使用或创建一个新片段。

public void fragmentHandle(Fragment fl, Fragment fr, String tl, String tr) {
    Fragment cFragLeft = manager.findFragmentById(R.id.fragment_left);
    Fragment cFragRight = manager.findFragmentById(R.id.fragment_right);

    Fragment checkLeft = manager.findFragmentByTag(tl);
    Fragment checkRight = manager.findFragmentByTag(tr);

    FragmentTransaction ft = manager.beginTransaction();

    if (cFragLeft != null && cFragRight != null && checkLeft != null
            && checkRight != null) {
        ft.detach(cFragRight).detach(cFragLeft).attach(fr).attach(fl)
                .addToBackStack(null).commit();
    } else if (cFragLeft != null && cFragRight != null && checkLeft == null
            && checkRight == null) {
        ft.detach(cFragLeft).detach(cFragRight)
                .add(R.id.fragment_left, fl, tl)
                .add(R.id.fragment_right, fr, tr).addToBackStack(null)
                .commit();
    } else if (cFragLeft != null && cFragRight != null && checkLeft == null
            && checkRight != null) {
        ft.detach(cFragLeft).detach(cFragRight).attach(fr)
                .add(R.id.fragment_left, fl, tl).addToBackStack(null)
                .commit();
    } else if (cFragLeft != null && cFragRight != null
            && checkRight == null && checkLeft != null) {
        ft.detach(cFragLeft).detach(cFragRight).attach(fl)
                .add(R.id.fragment_right, fr, tr).addToBackStack(null)
                .commit();
    } else {
        ft.add(R.id.fragment_left, fl, tl).add(R.id.fragment_right, fr, tr)
                .commit();
    }
}

当我更改方向,然后导航回以前保存的片段(第一个if语句)时,我的左右片段都显示空白屏幕。只有在调用案例1时才会发生这种情况,它似乎不记得那里的片段,即使片段管理器通过标签找到它们。

我也一直在检查我的onCreate,如下所示。

    protected void onCreate(Bundle savedInstanceState) {
    // super.onCreate
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fragment_handler);

    if (savedInstanceState == null) {
        fragmentHandle(nFragLeft, nFragRight, "menuMain", "main");
    }

}

还包括一个按钮声明只是为了完成的缘故。没有使用过onClickListeners并且不确定我是否应该更喜欢这个而不是xml onClick。

    public void sendDestination(View v) {
    nFragLeft = menudestFrag;
    nFragRight = destFrag;
    String tagLeft = "menuDestination";
    String tagRight = "destination";

    fragmentHandle(nFragLeft, nFragRight, tagLeft, tagRight);
}

有什么方法可以解决这个问题吗?只有在改变方向后才会发生。

1 个答案:

答案 0 :(得分:1)

这是因为在更改方向时会重新处理您的活动。

您可以解决此问题,在清单中添加android:configChanges="orientation|screenSize"(阻止在方向更改时重新创建活动):

<activity
        android:name="com.example.MyActivity"
         android:configChanges="orientation|screenSize" >
    </activity>