我的应用需要处于纵向模式,因此我将其设置在清单中:
android:screenOrientation="portrait"
但是我最近刚刚添加了另一个片段(FragA),其外观和功能在景观方面效果提升了10倍。有什么东西我可以放在我的FragA中,只是在横向制作该片段,同时保留应用程序的其余部分,或者通过这样做,我必须在我的其他片段中添加一些内容以保留它们作为肖像吗?
答案 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()
}