如何更改屏幕方向,而不在Android上创建新的活动?

问题描述 投票:0回答:7

不知道标题是否正确,事情是这样的。

我有一个应用程序,它在手机和平板电脑上的工作方式不同,在手机上它显示为纵向,在平板电脑上显示为横向。

为了实现这一目标,我创建了一个名为 CoreActivity 的类,它由我的所有活动扩展并执行以下操作:

public class CoreActivity extends Activity {
    protected boolean _landscape = false;

    public boolean isPhone() {
        int layoutSize = getScreenLayoutSize();
        return (layoutSize == Configuration.SCREENLAYOUT_SIZE_SMALL || layoutSize == Configuration.SCREENLAYOUT_SIZE_NORMAL);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (isPhone() && !_landscape) {
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }


    protected int getScreenLayoutSize() {
        return (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK);
    }
}

当我希望在横向模式下的手机设置上显示屏幕时,就会出现问题,为此,我使用以下命令:

@Override
protected void onCreate(Bundle savedInstanceState) {
    _landscape = true
    super.onCreate(savedInstanceState);
}

问题是,在手机上,如果用户将手机保持在纵向模式(就像人们所做的那样,因为大多数应用程序都处于纵向模式),那么 Activity 就会被创建和销毁,然后重新创建。但如果他们将其保持在横向模式下,那么它只会创建一次。

出现我的问题是因为在 onCreate 方法上我启动了加载数据的线程,并且还显示了片段。

有办法避免这个问题吗?有没有办法从纵向模式开始启动一个活动而不改变它,或者让它不创建两次?

预先感谢您提供的任何帮助

android screen-orientation
7个回答
13
投票

重新创建只是因为您强制调用

setRequestedOrientation
可能是为了设置屏幕方向。但是您不需要通过代码检查和更改它。您可以通过 xml 文件来完成。您可以根据屏幕尺寸设置不同的xml文件。但它有点 hack,所以不能保证将来。

在清单文件上,您可以通过以下方式强制:

<activity
   android:name="com.my.example.MyActivity"
   android:screenOrientation="landscape"/>  // or portrait

据我了解,您希望在小尺寸下强制使用纵向,在较大的屏幕尺寸下强制使用横向(或传感器)。但上述配置适用于所有屏幕尺寸。这是棘手的部分:

landscape
portrait
sensor
等都是here定义的整数。 正如您可能猜到的,您可以写
android:screenOrientation=0
而不是
landscape
。我们从 android 的入门课程中了解到,我们可以在 xml 文件中定义整数,然后它们的值可能会根据屏幕尺寸而变化。所以..

您应该首先为不同的屏幕尺寸创建不同的

integers.xml
文件。即:

values
 - integers.xml
values-large
 - integers.xml

对于

values/integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="orientation">1</integer>  // 1 for portrait
</resources>

对于

values-large/integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="orientation">0</integer> // 0 for landscape
</resources>

最后你必须通过以下方式操作清单文件:

<activity
   android:name="com.my.example.MyActivity"
   android:screenOrientation="@integer/orientation"/>  // read constant from xml files

您还可以使用

sensor
fullSensor
nosensor
locked
behind
reverseLandscape
reversePortait
选项。但我警告你,这是一个黑客解决方案。


6
投票

好吧,我找到了解决这个问题的方法,只需声明:

android:screenOrientation="locked"

清单中存在此问题的每项活动。

并继续以编程方式使用

setRequestedOrientation()
来定义
onCreate()
方法中的横向还是纵向,

它会起作用的! ;)


1
投票

如果您的所有活动在设备上必须具有相同的方向,您可以使用闪屏活动启动应用程序,像当前代码中那样设置方向,然后转发到您的 CoreActivity 或应用程序中的任何其他活动。

在您的 AndroidManifest.xml 集中

<activity
    android:name=".CoreActivity"
    android:screenOrientation="behind"/>

这将使用与活动堆栈中紧邻其下方的活动相同的方向。


0
投票

您是否尝试将

android:configChanges="keyboard|keyboardHidden|orientation"
添加到 AndroidManifest.xml 内的
<activity>
-标签中?

这应该可以防止系统重新启动活动,但我不确定这在以编程方式强制定向时是否真的有效。不过还是值得一试。


0
投票

在您的

manifest.xml
中尝试这个... 这将在方向改变时停止多次调用 onCreate()...

android:configChanges="keyboardHidden|orientation|screenSize"

0
投票

如果您希望您的 Activity 在设备方向更改时不要再次重新创建。

您应该在该活动的清单中使用它。 android:configChanges="方向|键盘|屏幕大小|键盘隐藏"

并且需要重写 onConfigurationChanged 函数。 在 onConfigurationChanged 一侧,您可以处理纵向和横向的不同视图。通过使用这个,你的 onCreate,onResume 不会调用方向改变

希望这对您有帮助。


-1
投票

您不需要手动处理这个问题。 Android 已经内置了对不同屏幕尺寸的支持

检查此链接

http://developer.android.com/training/multiscreen/screensizes.html

© www.soinside.com 2019 - 2024. All rights reserved.