首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在android上不创建新活动的情况下更改屏幕方向?

如何在android上不创建新活动的情况下更改屏幕方向?
EN

Stack Overflow用户
提问于 2014-11-19 19:25:50
回答 6查看 8.2K关注 0票数 4

我不知道标题是否正确,以下是发生的情况。

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

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

代码语言:javascript
复制
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);
    }
}

当我希望在横向模式下的电话设置上显示屏幕时,我会遇到问题,为此,我使用以下命令:

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    _landscape = true
    super.onCreate(savedInstanceState);
}

问题是,在手机上,如果用户拿着手机处于纵向模式(因为大部分应用程序都处于纵向模式),那么活动将被创建和销毁,然后重新创建。但如果他们将其设置为横向模式,那么它只会创建一次。

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

有没有办法避免这个问题?有没有办法从一开始就在画像模式下启动一个活动而不更改它,或者让它不创建两次?

提前感谢您所能提供的任何帮助

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-11-19 19:36:18

重新创建只是因为您正在强制执行此操作,可能是为了设置屏幕方向而调用setRequestedOrientation。但是,您不需要通过代码检查和更改它。您可以通过xml文件来完成此操作。您可以根据屏幕大小设置不同的xml文件。但它有点破解,所以在未来不能保证。

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

代码语言:javascript
复制
<activity
   android:name="com.my.example.MyActivity"
   android:screenOrientation="landscape"/>  // or portrait

因此,据我所知,您希望在小尺寸时强制使用肖像,而在较大屏幕尺寸时强制使用横向(或传感器)。但上述配置适用于所有屏幕尺寸。这里是棘手的部分:landscapeportraitsensor等都是定义为here的整数。正如您可能猜到的那样,您可以编写android:screenOrientation=0而不是landscape。我们从android开始的课程中了解到,我们可以在xml文件中定义整数,然后它们的值可能会随着屏幕大小的不同而变化。所以..。

您应该首先为不同的屏幕尺寸创建不同的integers.xml文件。即:

代码语言:javascript
复制
values
 - integers.xml
values-large
 - integers.xml

对于values/integers.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="orientation">1</integer>  // 1 for portrait
</resources>

对于values-large/integers.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="orientation">0</integer> // 0 for landscape
</resources>

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

代码语言:javascript
复制
<activity
   android:name="com.my.example.MyActivity"
   android:screenOrientation="@integer/orientation"/>  // read constant from xml files

您还可以使用sensorfullSensornosensorlockedbehindreverseLandscapereversePortait选项。但我警告你,这是一个黑客解决方案。

票数 12
EN

Stack Overflow用户

发布于 2018-06-08 06:57:57

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

代码语言:javascript
复制
android:screenOrientation="locked"

在清单中有这个问题的每一个活动。

并继续编程地使用setRequestedOrientation()来定义onCreate()方法中的横向或纵向,

它会起作用的!;)

票数 5
EN

Stack Overflow用户

发布于 2014-11-19 21:07:33

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

在您的AndroidManifest.xml集中

代码语言:javascript
复制
<activity
    android:name=".CoreActivity"
    android:screenOrientation="behind"/>

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27015688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档