不同碎片的特定方向

时间:2014-03-01 14:40:21

标签: android android-fragments screen-orientation

我想在我的应用程序中独立更改每个片段的屏幕方向(即片段A仅为横向,片段B仅为纵向),就像我可以使用AndroidManifest.xml进行的活动一样。

当我创建我的片段时,我使用Fragment.setArgunents(..)为每个片段传递一个屏幕方向常量。

我正在基础活动中切换片段:

public void setCurrentFragment(Fragment fragment, boolean addToBackstack) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, fragment);
        if (addToBackstack)
            fragmentTransaction.addToBackStack(Integer.toString(fragmentCount++));
        fragmentTransaction.commit();
}

我尝试将方向更改为存储在setCurrentFragment内的片段参数中的方向,使用onResume onCreate setRequestedOrientation片段方法使用{{1}}每个方法导致无限循环改变方向(整个活动被破坏并一次又一次地重建)。

有谁知道这样做的正确方法?

1 个答案:

答案 0 :(得分:0)

看起来这样做的唯一方法是将当前方向存储在其他位置(例如作为静态变量),以检查在重新创建活动之前设置的方向,并在每个片段中检查它是否是堆栈中的最后一个使用getFragmentManager().getFragments()

以下代码对我来说很好(我的getArguments捆绑内容是几个字符串):

private static int orientation;

@Override
public void onResume() {
super.onResume();
    Fragment lastFragment = getFragmentManager().getFragments().get(getFragmentManager().getFragments().size() - 1);
    if (lastFragment != null && lastFragment.getClass().equals(getClass())) {
        if (lastFragment.getArguments() != null && getArguments() != null) {
            if (lastFragment.getArguments().toString().equals(getArguments().toString())) {
                setCurrentOrientation(fragmentOrientation, getActivity());                  
            }
        }
    } else {
        setCurrentOrientation(contentPage, getActivity());
    }
}

private void setCurrentOrientation(int orientation) {
    if (orientation == currentOrientation) {
        return;
    } else {
        currentOrientation = orientation;
    }
    getActivity().setRequestedOrientation(currentOrientation);
}