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

如何改变屏幕方向,而不在android上创建新的活动?,android,screen-orientation,Android,Screen Orientation,我不知道标题是否正确,下面是发生的情况 我有一个应用程序,它在手机和平板电脑上的工作方式不同,在手机上它显示为人像,在平板电脑上显示为风景 为此,我创建了一个名为CoreActivity的类,该类由我的所有活动扩展,并执行以下操作: public class CoreActivity extends Activity { protected boolean _landscape = false; public boolean isPhone() { int la

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

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

为此,我创建了一个名为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);
}
我的问题发生在我希望在手机上以横向模式显示屏幕时,为此,我使用以下方法:

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方法上,我启动了加载数据的线程,并且还显示了片段

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


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

您不需要手动处理此问题。Android已经为不同的屏幕尺寸构建了it支持

检查此链接


重新创建只是因为您通过调用
setRequestedOrientation
来强制执行,可能是为了设置屏幕方向。但是,您不需要通过代码检查和更改它。您可以通过xml文件来实现。您可以根据屏幕大小设置不同的xml文件。但这是一个小黑客,所以没有保证在未来

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

<activity
   android:name="com.my.example.MyActivity"
   android:screenOrientation="landscape"/>  // or portrait
对于
值/integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="orientation">1</integer>  // 1 for portrait
</resources>
<?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
//从xml文件中读取常量

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

你是否尝试将android:configChanges=“keyboard | keyboardHidden | orientation”添加到AndroidManifest.xml中的
-标记中


这应该会阻止系统重新启动活动,但我不确定当以编程方式强制定向时,这是否会真正起作用。不过值得一试。

在您的
manifest.xml
中尝试一下。。。 当方向改变时,这将停止多次调用onCreate()

android:configChanges="keyboardHidden|orientation|screenSize"

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

在您的AndroidManifest.xml集合中

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


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

我找到了解决此问题的方法,只需声明:

android:screenOrientation="locked"
在清单中包含此问题的每个活动上

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


它会起作用的!;)

活动总是在方向改变后重新创建。我的答案对你有用吗这确实设置了屏幕方向,不幸的是,它为所有屏幕大小设置了方向,我的问题是,对于大多数活动,我希望不同的屏幕大小有不同的方向,而对于一个活动有相同的方向,从我搜索的结果来看,没有办法做到这一点androidmanifest@Cruces现在检查一下,伙计。这是checkmate.yep,这似乎正是我想要做的,感谢很多人,他们真的帮助了我。这似乎不是一个黑客解决方案,比configChanges更干净,每个人和他们的母亲都警告我不要使用ConfigChangesIDN不适合我。
@integer/orientation
总是从
values/
目录获取,即使在我知道应该从更合格的目录(如
values-sw600dp/
)获取的设备上也是如此。奇怪的是,如果您在运行时通过
getResources().getInteger(…)
获取整数,它会从更限定的目录中进行选择。在我看来,这似乎是安装程序中解析
AndroidManifest.xml
的一个bug。在查找整数资源时,它不会使用限定符(如
-swNNNdp
)来搜索最佳匹配的资源。现在,Android Studio中会出现一条红色下划线警告,指出您不能在清单中使用以这种方式在设备配置之间更改的资源值。这很有意义,因为清单在APK中是一个静态文件,所以这些引用必须在构建时解决。问题是,平板电脑的布局与手机不同,应用程序的设计使平板电脑上的所有布局都以横向模式查看,而手机的大多数布局都以纵向模式查看,为了正确实现平板电脑的纵向模式和手机的横向模式,这将花费太多的时间。不,很抱歉,它似乎不起作用,它仍然会破坏原始活动并从创建时重新启动活动。这似乎起作用,我想是屏幕大小操作员造成了差异,我需要比目前为止我用这个迷你应用程序做的测试多得多的测试,但我认为这是我想要的,谢谢你的回答,我会尝试在我的情况下,它工作得很好…,尝试一下,如果它适合你的要求,给一个评级..是的,它确实工作,但从我所研究的配置更改有点不可以更改,还是一个很好的解决方案,谢谢,这不是我想要的,但我从来都不知道“背后”的定位,谢谢,它确实对我有用。选项
locked
没有锁定。这是一个很好的解决方案