2011-05-06 113 views
131

当旋转屏幕时,我无需任何更改。我的应用程序在第一次加载时显示一个随机图像,并且应该旋转设备而不是选择另一个随机图像。 我如何(简单地)使这种行为停止?不要在方向更改时重新加载应用程序

+0

它也可以锁定(也可能是解锁)从代码屏幕方向。只需从https://github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/delight/android/baselib/Screen.java调用'Screen.lockOrientation(this)'即可。它允许解锁清单所没有的。 – caw 2015-03-04 18:34:34

+0

@Escobar Ceaser什么是这个问题的正确解决方案。即使我有同样的要求。 – Prabs 2015-08-03 10:30:14

+0

我想在代码中以编程方式执行此操作。 – pollaris 2017-09-27 16:05:10

回答

200

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

  1. 由于一些答案的建议,你可以区分你的活动是第一次创建,并从savedInstanceState正在恢复的情况。这是通过覆盖onSaveInstanceState并检查onCreate的参数来完成的。

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

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

就我个人而言,我会选择(3)。当然,如果将应用程序锁定到其中一个方向对您来说没有问题,那么也可以使用(2)。

+13

因此对于#3你是否说我所要做的就是将该行添加到我的清单中?因为它不起作用。 – 2011-05-06 15:23:36

+5

是的,#3从来没有为我工作过。 – dmon 2011-05-06 15:29:55

+0

大声笑,那么为什么人们不要先测试它,而是继续发布它? – 2011-05-06 15:32:51

2

只需添加到您的AndroidManifest.xml

<activity android:screenOrientation="landscape"> 

我的意思是,有一个活动标签,将其添加为另一个参数。如果您需要纵向定位,请将横向改为纵向。希望这可以帮助。

+0

即时通讯不想带走旋转屏幕的能力。我只是不希望我的应用程序重新加载...正如我所提到的。 – 2011-05-06 15:11:32

+0

ps ...这不管用。它只是迫使应用程序以一定的方向显示。旋转屏幕仍然会重新加载活动 – 2011-05-06 15:41:52

8

这是我的经验,它实际上更好地处理适当的方向更改,而不是试图阻止非默认行为。

当您的应用程序再次通过onCreate()运行时,您应该将当前显示的图像保存在onSaveInstanceState()中并正确恢复。

+0

#3是一个非常有效的解决方案。这是**精确的**工具来解决这个确切的问题。你为什么说它是鞋垫? – Pacerier 2014-11-20 07:36:12

+1

@Prier你只需阅读文档。 “注意:应该避免使用android:configChanges,并且只能用作最后的手段。请阅读*处理运行时变化*以获得更多有关如何正确处理由于配置更改而重新启动的信息。” – 2015-08-07 12:42:54

+0

你可以发布一个例子保存和恢复。 – pollaris 2017-09-27 16:07:13

197

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

在API级别13或更高版本中,屏幕大小在方向更改时发生更改,因此仍会导致活动在方向更改时被销毁和启动。

只需添加“屏幕尺寸”属性,像我一样如下:

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

现在,当你改变方向(与屏幕尺寸的变化),活动保持其状态和被调用。当方向改变时,这将保持屏幕上的任何内容(即:Web视图中的网页)。

从该网站了解到这一点: http://developer.android.com/guide/topics/manifest/activity-element.html

此外,这显然是一个坏的做法,让阅读下面关于处理运行时更改链接:

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

+1

谢谢..其工作后添加“screenSize”与“方向” – 2013-05-31 07:56:35

+0

作品在Samsung Galaxy Nexus android 4.2.1! 'android:configChanges =“orientation | screenSize”' – 2014-03-15 13:40:35

+0

令人惊叹。已经花了很长时间来完成代码,以解决我从一开始就关注活动重新加载和视频的问题。这就是解决方案! ++++ 1 – 2014-05-03 17:28:38

0

只需使用:android:configChanges="keyboardHidden|orientation"

+0

对代码做些什么会有所帮助。 – 2013-02-07 20:37:39

22

你只需要去AndroidManifest.xml和里面或在你的活动标签,你必须输入这行代码为某人在那里说:

android:configChanges="orientation|screenSize" 

所以,你有这样的事情:

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

希望工程!

+0

经过一个小时的搜索后,这对我有用:D – yashhy 2014-04-09 14:33:42

+0

它没有加载我的布局土地布局。 :(没有为我工作 – 2016-10-21 11:22:04

+0

感谢,作品像一个魅力 – 2017-08-08 13:35:04

-1

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

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

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

这将如何工作?你不只是说一些明确的运行时间,否则会默认做什么? – Danielson 2015-04-09 10:06:23

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

就在清单文件的活动选项卡中添加android:configChanges="orientation|screenSize"

因此,当方向更改时,活动不会重新启动。

+0

它的工作。但是当我使用为每个方向布局layout.xml和layout-land.xml。它应用两种方向的横向布局。如果我只使用“orientation”,它给出我期望的但是重新加载。你能帮忙吗? – 2015-06-24 07:31:22

+1

@KarthikeyanVe这就是当你试图作弊时,会出现问题,你将*重新开始你的活动来改变布局,继续使用真正的解决方案,它使用'onSaveInstanceState()'和'onCreate()'。 – 2015-08-07 12:38:45

+0

@MarcPlano -Lesay,我想怎么做? – Weaboo 2018-01-14 12:20:08

0

正如Pacerier提到,

android:configChanges="orientation|screenSize"

4

该解决方案是目前最好的工作之一。在您的清单文件中添加

<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 

    } 
} 
3

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

1

在鲜明的文件中添加到每个活动中。这将有助于

android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize" 
1

以上所有答案都不适用于我。所以,我已经通过提及labelscreenOrientation修复如下。现在一切都精细

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