Android 禁用片段中的自动旋转

Android 禁用片段中的自动旋转,android,android-fragments,rotation,Android,Android Fragments,Rotation,我有一个PictureFragment,当我从缩略图中选择图片时,我使用它全屏显示图片。它工作得很好,但当我旋转我的智能手机时,图片也会旋转,缩放得非常难看,所以它的高度现在是它的实际宽度,等等。如何关闭此碎片的旋转?我一直在阅读如何在整个活动中执行此操作,但在其他活动中,我希望保持自动旋转。或者,如果这也很容易实现,我如何能够在旋转时对图片进行有意义的缩放以保持其纵横比?在片段中调用insideonResume以锁定到纵向: getActivity().setRequestedOrientat

我有一个PictureFragment,当我从缩略图中选择图片时,我使用它全屏显示图片。它工作得很好,但当我旋转我的智能手机时,图片也会旋转,缩放得非常难看,所以它的高度现在是它的实际宽度,等等。如何关闭此碎片的旋转?我一直在阅读如何在整个活动中执行此操作,但在其他活动中,我希望保持自动旋转。或者,如果这也很容易实现,我如何能够在旋转时对图片进行有意义的缩放以保持其纵横比?

片段中
调用inside
onResume
以锁定到纵向:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
然后在
onPause
中解锁方向:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
OBS!为了方便起见,请在使用此方法之前使用
if(getActivity!=null)

加载项清单

android:configChanges=“keyboardHidden | orientation”

加入你的片段

@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (getActivity() != null) {          
            if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        }       
}

使用谷歌导航组件的简单解决方案:

在您的活动中:

navController.addOnDestinationChangedListener { _, destination, _ ->
        if (destination.id == R.id.fragmentB) {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        } else if (requestedOrientation != ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR) {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
        }
    }
此逻辑将“fragmentB”(来自导航图的Id资源)的屏幕方向锁定为纵向


navController
androidx.navigation.navController

的一个实例,最好将
方向设置为您的
活动
。我只有一个activityy,可以通过fragmentmanager在屏幕之间切换。为什么我对这个问题不感兴趣?我想这可能会回答你的问题:谢谢。另一个问题:使用很少的活动(一个或两个)并使用片段管理器进行大量的屏幕更改是否有意义?还是在每个屏幕上都使用一个活动更好?@MD它有点旧了,但是如果你只使用一个活动呢?如果我从FragmentA(横向模式)导航到FragmentB(从顶部包含portait锁逻辑),我发现自己处于一个无休止的活动重启循环中