方向更改时不要重新加载应用程序


152

屏幕旋转时,我根本不需要任何更改。我的应用程序显示时,第一次加载和旋转设备应随机图像选择另一随机图像。我如何(简单地)使这种行为停止?


1
也可以从代码锁定(并可能解锁)屏幕方向。只需Screen.lockOrientation(this)github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…进行调用即可。它允许解锁清单没有的。
Caw

@Escobar Ceaser这个问题的正确解决方案是什么?即使我有相同的要求。
2015年

我想以编程方式在代码中执行此操作。
pollaris

Answers:


249

通常有三种方法可以做到这一点:

  1. 正如一些答案所建议的那样,您可以区分首次创建活动并从中恢复活动的情况savedInstanceState。这是通过覆盖onSaveInstanceState和检查的参数来完成的onCreate

  2. 您可以通过在清单中添加android:screenOrientation="portrait"(或"landscape")来将活动锁定在一个方向<activity>

  3. 您可以通过android:configChanges="orientation|screenSize"<activity>标签中指定,告诉系统您打算自己处理屏幕更改。这样,将不会重新创建活动,而是会收到回调(您可以忽略该回调,因为它对您没有用)。

我个人会选择(3)。当然,如果将应用程序锁定为一种方向就可以了,那么您也可以选择(2)。


13
所以对于#3,您是说我要做的就是将该行添加到清单中吗?因为它不起作用。
Jimmy D


16
@EscobarCeaser,对于Android 3.2及更高版本,您需要android:configChanges="orientation|screenSize"
Pacerier

9
android:configChanges="orientation|screenSize"为我工作。感谢@Pacerier
Don Larynx

1
请用android:configChanges="orientation|screenSize"API> = 13的值更新您的答案案例#3 ,因为很多人认为您的答案是主要答案!
radistao 2015年

215

Xion的答案很接近,但是#3(android:configChanes="orientation")除非应用程序的API级别为12或更低,否则将不起作用。

在API级别13或更高级别中,屏幕尺寸会在方向更改时发生变化,因此,这仍然会导致活动在方向更改时被破坏并启动。

只需添加“ screenSize”属性即可,如下所示:

<activity
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

现在,当您更改方向(和屏幕尺寸更改)时,活动保持其状态并被onConfigurationChanged()调用。当方向更改时,这将保留屏幕上的所有内容(即Webview中的网页)。

从以下站点学到的:http : //developer.android.com/guide/topics/manifest/activity-element.html

另外,这显然是一种不好的做法,因此请阅读以下有关处理运行时更改的链接:

http://developer.android.com/guide/topics/resources/runtime-changes.html


2
谢谢...添加“方向”和“ screenSize”后的工作
Pratik Butani

可在Samsung Galaxy Nexus android 4.2.1中使用!android:configChanges="orientation|screenSize"
Vincent Ducastel 2014年

惊人。为了解决我在进行活动重载和从头开始播放视频时遇到的问题,已经花了很多个小时研究代码。解决方案就在这里!++++ 1
Mathias Asberg 2014年

6
不好的做法?PFFT,现实生活中的人有最后期限,如果有效,它就会起作用;)
Kacy 2015年

如果这是一个不好的做法,那为什么会得到这么多的支持?
Sharp Edge

26

您只需要转到AndroidManifest.xml和内部或活动标签中,就必须输入此行代码,就像有人在上面说的那样:

android:configChanges="orientation|screenSize"

因此,您将获得以下内容:

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

希望它能起作用!


它没有加载我的布局-土地布局。:(没有工作对我来说
PIYUSH poriya

16
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

只需添加 android:configChanges="orientation|screenSize"清单文件的活动标签即可。

因此,方向更改后,“活动”将不会重新启动。


它的工作。但是,当我为每个方向分别使用layout.xml和layout-land.xml时。两种方向的应用景观布局。如果我仅使用“方向”,它会提供我期望的但重新加载。你能帮上忙吗?
Karthikeyan Ve Ve

1
@KarthikeyanVe这就是您要作弊时的问题。你将必须重新启动,以改变布局的活动。继续,只使用实际的解决方案,即使用onSaveInstanceState()onCreate()
Marc Plano-Lesay 2015年

@ MarcPlano-Lesay,我应该怎么做?
Ahsan

@Weaboo实际的解决方案中的问题链接:developer.android.com/guide/topics/resources/...
马克普莱诺- Lesay

@ MarcPlano-Lesay我为纵向和横向模式设置了单独的布局,如果我以横向或纵向模式打开我的应用程序,效果很好,但是每当尝试在运行时更改方向时,它都会关闭我的应用程序,但是当我登录到我的应用程序时然后导航到MainActivity并尝试更改方向,它会重新加载该活动并正常运行。现在的问题是为什么?我的代码中存在逻辑错误吗?Idk,但我尝试调试该应用几次,但找不到任何东西。此外,我不想重新开始活动,为什么每当配置更改时我们都不能仅调整各自的布局?
Ahsan

10

根据我的经验,实际上最好是正确地处理方向变化,而不是试图冒犯非默认行为。

您应该保存当前正在显示的图像,onSaveInstanceState()并在应用程序onCreate()再次运行时正确还原它。


#3是完全有效的解决方案。它是解决此确切问题的精确工具。你为什么说这是鞋拔呢?
Pacerier 2014年

1
@Pacerier只需阅读文档。“注意:android:configChanges应避免使用,并且只能将其用作最后一种手段。请阅读处理运行时更改以获取有关如何正确处理由于配置更改而导致的重新启动的更多信息。”
Marc Plano-Lesay 2015年

您能否发布一个保存和还原的示例。
pollaris

6

到目前为止,此解决方案是最佳的解决方案。在清单文件中添加

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

然后在您的活动类中添加以下代码

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}

4

android:configChanges="keyboardHidden|orientation|screenSize"为清单中的所有应用活动标签添加。


3

只需将此添加到您的 AndroidManifest.xml

<activity android:screenOrientation="landscape">

我的意思是,有一个活动标签,将此添加为另一个参数。如果您需要纵向放置,请将风景更改为纵向。希望这可以帮助。


即时通讯不希望带走旋转屏幕的功能。我只是不希望我的应用程序重新加载...正如我所说。
吉米D

ps ...这还是行不通的。它只是强制应用以特定方向显示。旋转屏幕仍会重新加载活动
Jimmy D


2

以上所有答案均不适用于我。所以,我有提固定labelscreenOrientation像下面。现在一切都很好

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>




1

正如Pacerier所说,

android:configChanges="orientation|screenSize"


-1

我不知道最好的解决方案,但是我在这里描述:

首先,您需要在课程中获得证书:

<application
    android:name=".App"
    ...

其次,在我的App类中,我确实是这样的:

public class App extends Application {
    public static boolean isOrientationChanged = false;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }

}

第三,您需要为“方向更改”设置一个标志,在我的情况下,我总是在调用应用程序导航中的上一个活动时进行设置,因此仅在创建后一个活动时才调用一次。

isOrientationChanged = false;

因此,每次在那种情况下更改屏幕的方向时,都会在每次更改此设置时对其进行设置,它会检查方向是否发生变化,如果有,则会根据该标志的值对其进行验证。

基本上,每当我发出异步改造请求时就必须使用它,他在每次改变方向时都会调用它,从而不断使应用程序崩溃:

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

我不知道这是否是最优雅,最漂亮的解决方案,但至少在这里它是有用的:)


-2

onCreate在您的活动中的方法之后,添加此代码,其中包含WebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

1
这将如何运作?您不是只是对运行时明确说些什么,否则默认情况下会做什么?
Danielson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.