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

时间:2014-11-19 11:25:50

标签: android screen-orientation

我不知道标题是否正确,这是发生的事情。

我的应用程序在手机和平​​板电脑上的工作方式不同,在手机上显示为平板电脑上的肖像,显示为风景。

为了达到这个目的,我创建了一个名为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);
}
问题是,在手机上,如果用户手持手机处于纵向模式(就像大多数应用程序处于纵向模式一样),则会创建并销毁活动,然后重新创建。但是如果他们在横向模式下持有它,那么它只创建一次。

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

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

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

6 个答案:

答案 0 :(得分:12)

重新发生只是因为你强迫,通过调用setRequestedOrientation可能是为了设置屏幕方向。但是,您无需通过代码检查和更改它。你可以通过xml文件来完成。您可以根据屏幕大小设置不同的xml文件。但它有点破解,所以将来无法保证。

在清单文件中,您可以强制执行:

<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

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

答案 1 :(得分:1)

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

android:configChanges="keyboardHidden|orientation|screenSize"

答案 2 :(得分:1)

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

android:screenOrientation="locked"

对于此问题在清单中声明的​​每个活动。

继续以setRequestedOrientation()编程方式定义onCreate()方法中的横向或纵向方向,

也许有帮助

答案 3 :(得分:0)

您无需手动处理此问题。 Android已经建立了对不同屏幕尺寸的支持

检查此链接

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

答案 4 :(得分:0)

您是否尝试将android:configChanges="keyboard|keyboardHidden|orientation"添加到AndroidManifest.xml内的<activity> - 标记中?

这应该会阻止系统重新启动Activity,但我不确定在以编程方式强制方向时这是否真的有用。虽然值得一试。

答案 5 :(得分:0)

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

在AndroidManifest.xml中设置

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

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