在Android上,活动方向会自动更改。

9 浏览
0 Comments

在Android上,活动方向会自动更改。

我正在开发一款基于Android的移动应用程序,minSdkVersion=15。我希望支持平板电脑的两种方向,而智能手机只支持纵向。一切都运行得很顺利,但我遇到了一个小bug,让我疯狂。当智能手机处于横向模式时,我尝试触发一个新的Activity,它会在横向模式下打开一段时间,然后自动旋转为纵向。

我的每个Activity都扩展了一个GeneralActivity类:

public class GeneralActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 如果是智能手机,锁定方向为纵向
        if (!Helper.isTablet(this.getApplicationContext())){
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
}

我使用以下函数来检测平板电脑:

public class Helper {
    public static boolean isTablet(Context context){
        Configuration config = context.getResources().getConfiguration()
        return config.smallestScreenWidthDp >= 600;
    }
}

我选择不在Manifest.xml中指定android:screenOrientation,因为这样我能够支持平板电脑的所有界面方向。

我是否遗漏了什么?

编辑

我决定采用Jonathan的答案中提到的最佳实践,但我描述的问题仍然存在。这是我的Github存储库: https://github.com/giacmarangoni/Android-Orientation-Test

0
0 Comments

在Android N和O上,我遇到了同样的问题,并找到了解决方法。

我仍然在onCreate方法中使用setRequestedOrientation,但我在清单中的每个活动中添加了以下内容:

android:screenOrientation="behind"

这可以确保活动与上一个活动具有相同的方向启动。之后的setRequestedOrientation将覆盖它,但如果它与之前的活动相同,用户将看不到任何变化。

当您使用它时,是否有任何副作用?

0
0 Comments

在Android上,Activity的方向会自动改变的问题可以通过以下方法解决:

在出现问题的每个Activity的清单文件中添加android:screenOrientation="locked",并在onCreate()方法中使用setRequestedOrientation()方法来定义横向或纵向方向。

在GitHub项目中,只需在清单文件中添加locked方向即可解决问题,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.giacomomarangoni.orientationtest">
    <application
        android:allowBackup="true"
        android:icon="/ic_launcher"
        android:label="/app_name"
        android:supportsRtl="true"
        android:theme="/AppTheme">
        <activity android:name=".MainActivity"
            android:screenOrientation="locked">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".OtherActivity"
            android:screenOrientation="locked">
        </activity>
    </application>
</manifest>

希望对你有所帮助。

你真是个英雄。我通常不会只为了表扬而发表评论,但我想强调对于任何遇到这个问题的人来说,这是正确的解决方案。这应该是被接受的答案,特别是因为它允许任何方向锁定逻辑与标准的setRequestedOrientation方法一起使用。

这是最好的答案...你救了我!我在清单文件中添加了locked,当我的MediaPlayer加载完成后,使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);来释放锁定。非常好用。

0
0 Comments

在Android上,当屏幕方向自动更改时,可以将以下内容整理出问题的原因和解决方法:

问题原因:屏幕方向自动更改时,Activity的布局可能会出现问题,导致用户体验不佳。

解决方法:通过使用资源和尺寸限定符来解决此问题。

1. 在res/values目录下创建一个名为bools.xml(文件名可以自定义)的文件,将以下代码添加到该文件中:



    true

2. 在res/values-sw600dp和res/values-xlarge目录下创建相同的bools.xml文件,将以下代码添加到这两个文件中:



    false

这里的res/values-sw600dp和res/values-xlarge是根据屏幕尺寸进行限定的资源目录。

3. 在Activity的onCreate方法中添加以下代码:

if(getResources().getBoolean(R.bool.portrait_only)){
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

这段代码会根据屏幕尺寸来设置Activity的方向。如果屏幕尺寸大于等于600dp或者是x-large的设备(如平板电脑),则会保持根据传感器和用户锁定的旋转进行自由变化。其他设备(如手机)则会被限制为只能竖屏显示。

通过以上步骤,可以解决Activity在屏幕方向自动更改时出现的问题。

源文链接:原回答

0