在我的活动中仅设置1个片段的方向,而其余片段为纵向

时间:2012-10-03 07:42:29

标签: android android-fragments orientation

我的应用需要处于纵向模式,因此我将其设置在清单中:

android:screenOrientation="portrait"

但是我最近刚刚添加了另一个片段(FragA),其外观和功能在景观方面效果提升了10倍。有什么东西我可以放在我的FragA中,只是在横向制作该片段,同时保留应用程序的其余部分,或者通过这样做,我必须在我的其他片段中添加一些内容以保留它们作为肖像吗?

8 个答案:

答案 0 :(得分:87)

在您希望特定(在本例中为纵向)方向的片段中使用以下代码行。

getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

如果您希望片段中有方向,这取决于用户持有其设备的方式,请使用以下代码行。

getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

希望,这将为您提供预期的解决方案。

答案 1 :(得分:16)

在每个片段中,设置请求的方向。

参考文档:http://developer.android.com/reference/android/content/pm/ActivityInfo.html

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   // Fragment locked in portrait screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);    

   // Fragment locked in landscape screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

   // Fragment screen orientation normal both portait and landscape       
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

答案 2 :(得分:13)

Orientation属性是每个活动,因此您可以仅为包含该片段的活动声明方向,使其处于横向状态,其余活动将保持原样。

答案 3 :(得分:1)

在片段FragA中:

@Override
public void onResume() {
    super.onResume();
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

}


@Override
public void onPause() {
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    super.onPause();
}

onPause 方法代码可确保您的活动恢复为纵向

答案 4 :(得分:0)

所以我现在正在处理这个问题。我们只有人像模式应用程序(目前)。但是风景中需要有一个片段。我们使用的是“活动”方法,因此被接受的答案将不会对我有帮助。

我能想到的最快的解决方案就是这个。

private var swappingOrientation = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    if(savedInstanceState == null) {
        swappingOrientation = true
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }
    }
}

override fun onDestroy() {
    super.onDestroy()

    if(!swappingOrientation) {
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }
    }
    swappingOrientation = false
}

如果您交换方向或不交换方向,则将信息保留在 swappingOrientation 变量中。在开始创建片段时,只有在没有保存状态时,它才会改变方向。方向只有在当前未更改时才重新变回。

这是一个超快速的解决方案,当您返回上一个片段时,它可能会导致屏幕闪烁。我也没有完全测试它,因此它可能会有其他问题,请记住这一点。

答案 5 :(得分:0)

第一个片段:

@Override
    public void onResume() {
        super.onResume();
        getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    }

第二个片段:

     @Override
        public void onResume() {
            super.onResume();
 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
   }

答案 6 :(得分:0)

这是一个古老的问题,但回答此问题只是为了防万一有人需要解决方案作为OP。实现此目的的简单方法如下。

public class LandscapeFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       super.onViewCreated(view, savedInstanceState);

       getActivity().setRequestedOrientation(
              ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    }

   @Override
   public View onDestroyView() {
       super.onDestroyView();

       getActivity().setRequestedOrientation(
             ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

然后从您的任何片段中extend LandscapeFragment

答案 7 :(得分:0)

好吧,我几乎把头都甩开了,这对我来说可以用jetpack导航组件碎片

这是基本片段类

abstract class BaseFragment : Fragment(){   

var rotated = false

fun rotate() {
        val currentOrientation = activity?.resources?.configuration?.orientation //this is diffrent from  Configuration.ORIENTATION_LANDSCAPE
        Log.e("currentOrientation--->",currentOrientation.toString())

        if (currentOrientation != null) {
            if (currentOrientation !=  Configuration.ORIENTATION_LANDSCAPE) {
                activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
            }else{
                rotated=true
            }
        }else{
            //impossible
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }
    }


    override fun onDestroyView() {
        super.onDestroyView()
        if (rotated)
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
    }

}

我将其放在任何片段中,希望将其美化

override fun onStart() {
    super.onStart()
    rotate()
}