android:screenOrientation="portrait"已弃用,求强制竖屏有效解决方案
解决Android竖屏锁定问题(替代弃用的android:screenOrientation="portrait")
方案1:使用Manifest新属性(API 33+)
从Android 13(API level 33)开始,android:screenOrientation="portrait"被标记为弃用,官方推荐在Activity的Manifest配置中替换为android:activityOrientation="portrait":
<activity android:name=".YourActivity" android:activityOrientation="portrait"> </activity>
需要兼容低版本时,可以同时保留两个属性(低版本系统会自动忽略activityOrientation):
<activity android:name=".YourActivity" android:screenOrientation="portrait" android:activityOrientation="portrait"> </activity>
方案2:代码中强制锁定竖屏(全版本兼容)
如果Manifest配置无效,在Activity的onCreate方法中尽早调用以下代码,确保在视图加载前完成方向锁定:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 强制锁定竖屏,兼容所有Android版本 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_main); }
之前编程方式无效大概率是调用时机不对——必须在setContentView之前或同时执行,避免系统先处理旋转逻辑。
方案3:拦截配置变化阻止旋转
通过监听配置变化,避免系统因旋转重启Activity,同时强制转回竖屏:
- 先在Manifest中给Activity添加配置监听:
<activity android:name=".YourActivity" android:configChanges="orientation|screenSize|smallestScreenSize"> </activity>
- 重写
onConfigurationChanged方法:
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); // 检测到横屏时强制转回竖屏 if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } }
方案4:应用全局锁定竖屏(所有Activity生效)
无需逐个配置Activity,在自定义Application类中注册生命周期回调,自动给每个Activity设置竖屏:
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } // 其余生命周期方法可留空 @Override public void onActivityStarted(@NonNull Activity activity) {} @Override public void onActivityResumed(@NonNull Activity activity) {} @Override public void onActivityPaused(@NonNull Activity activity) {} @Override public void onActivityStopped(@NonNull Activity activity) {} @Override public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {} @Override public void onActivityDestroyed(@NonNull Activity activity) {} }); } }
记得在Manifest中指定这个自定义Application:
<application android:name=".MyApp" ...> </application>
关键注意事项
- 如果应用开启了多窗口模式(默认
android:resizeableActivity="true"),系统可能会忽略竖屏锁定,可在Manifest中添加android:resizeableActivity="false"禁用多窗口以确保生效。 - Android 14+设备若上述方法无效,可尝试替换为
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT),该常量基于用户偏好的竖屏方向,兼容性更好。
内容的提问来源于stack exchange,提问作者Vijay Rathod
相关产品推荐
相关产品推荐

