android 在我的Activity中,只为1个片段设置方向,而其余片段为纵向

kr98yfug  于 12个月前  发布在  Android
关注(0)|答案(7)|浏览(134)

我的应用需要在肖像模式下,所以我在清单中设置它:

android:screenOrientation="portrait"

但我最近添加了另一个片段(FragA),它在景观中的外观和功能都要好10倍。有没有什么东西可以放在我的FragA里面,让这个片段在风景中,同时保留应用程序的其余部分在肖像中,或者通过这样做,我必须添加一些东西到我的其他片段,以保持它们作为肖像保留?

6jygbczu

6jygbczu1#

在片段中使用以下代码行,其中需要特定的方向(在本例中为纵向)。

getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

如果你想在片段中有一个方向,这是基于用户持有他的设备的方式,然后使用下面的代码行。

getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

希望,这将给你给予预期的解决方案。

svmlkihl

svmlkihl2#

在每个片段中,设置请求的方向。
参考文件: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);
}
r7knjye2

r7knjye23#

Orientation属性是针对每个Activity的,因此您可以仅为包含片段的Activity声明方向,以便它处于横向中,其余Activity将保持原样。

vsikbqxv

vsikbqxv4#

所以我现在正在处理这个问题。我们只有肖像模式应用程序(目前)。但有一个片段需要在景观。我们使用的是单一活动方法,所以公认的答案对我没有帮助。
我能想到的最快的解决办法就是这个。

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变量中。在片段创建之初,它会改变方向,只有当没有保存状态时。并且仅当当前未改变方向时,方向才再次改变回来。
这是一个超级快速的解决方案,当你返回到前一个片段时,它会产生屏幕 Flink 。我也没有完全测试它,所以它可能有其他问题,所以请记住这一点。

vshtjzan

vshtjzan5#

第一碎片:

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

    }

第二段:

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

bpzcxfmw6#

这是一个老问题,但回答这个问题只是以防任何人想要的解决方案,因为OP需要。实现这一点的简单方法如下。

public class LandscapeFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

       getActivity().setRequestedOrientation(
              ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

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

       getActivity().setRequestedOrientation(
             ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

然后extend这个LandscapeFragment从你的任何片段,你想在横向模式下启动它。

hiz5n14c

hiz5n14c7#

好吧,在我几乎打爆我的头之后,这对我用喷气背包导航组件碎片有效
这是基本的片段类

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()
}

相关问题