【问题标题】:Fragments android orientation loss of fragment片段的android方向丢失片段
【发布时间】:2013-11-27 17:47:38
【问题描述】:

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

我选择使用大的 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);
}

有没有办法解决这个问题?只有在改变方向后才会发生。

【问题讨论】:

    标签: android android-fragments android-orientation


    【解决方案1】:

    发生这种情况是因为在更改方向时重新创建了您的活动。

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

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

    【讨论】:

    • 我知道我可以通过更改 android 清单来做到这一点,但在我看来这不是处理片段的合法方式。它只是阻止 android 使用它的本机方向处理。我正在寻找一种检索片段的方法,因为 android 似乎能够通过标签找到它们,但似乎并没有保存该特定片段的数据。我还找到了一种不同的解决方法,以防我不需要在我的片段中保留任何数据,只需删除和添加片段而不是附加和分离,但是我无法保留数据。跨度>
    • 尽管如此,我已经尝试了您的解决方案,但遇到了一个直接的问题。我一直在制作动态 UI,这意味着它可以从一个窗格切换到两个窗格(端口到陆地),反之亦然。使用此解决方案,它不会更改布局,因为它没有重新创建。我通过 onCreateView 调用 xml 布局,因此我认为这个解决方案不适合我;/
    • 谢谢,你的观点很好。你在我的应用程序中提出了问题。我有另一个建议给你,我没有尝试,但我认为会起作用..检查this onconfigurationChange attach/add/repalce 你从后台堆栈中的最后一个片段。希望对您有所帮助。
    • 如果只是返回一层,它会起作用,但我使用的是自定义面包屑导航理念,我应该能够一次上升 4 层(最大)。不过仍然感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多