旋转屏幕时我根本不需要改变任何东西。我的应用在首次加载时显示随机图像,并且不选择另一个随机图像时旋转设备。 我怎样(简单地)让这种行为停止?
答案 0 :(得分:240)
通常有三种方法可以做到这一点:
根据建议的一些答案,您可以区分第一次创建活动并从{{1}}恢复活动的情况。这是通过覆盖savedInstanceState
并检查onSaveInstanceState
的参数来完成的。
您可以通过在清单中将onCreate
(或android:screenOrientation="portrait"
)添加到"landscape"
来将活动锁定在一个方向。
您可以通过在<activity>
标记中指定android:configChanges="orientation|screenSize"
告诉系统您打算自行处理屏幕更改。这样就不会重新创建活动,而是会收到一个回调(你可以忽略它,因为它对你没用)。
就个人而言,我会选择(3)。当然,如果将应用程序锁定到其中一个方向对你来说没问题,你也可以选择(2)。
答案 1 :(得分:211)
Xion的回答非常接近,但除非应用程序的API级别为12或更低,否则#3(android:configChanes="orientation"
)将无效。
在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 :(得分:25)
您只需要转到AndroidManifest.xml
内部或活动标签中,您必须输入这行代码,因为有人说:
android:configChanges="orientation|screenSize"
所以,你会有这样的事情:
<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>
希望它有效!
答案 3 :(得分:16)
<activity android:name="com.example.abc"
android:configChanges="orientation|screenSize"></activity>
只需在清单文件的活动标签中添加android:configChanges="orientation|screenSize"
。
因此,方向更改时,Activity不会重新启动。
答案 4 :(得分:9)
根据我的经验,实际上更好地处理方向更改而不是试图窃取非默认行为。
您应该保存当前显示在onSaveInstanceState()
中的图片,并在应用程序再次通过onCreate()
时正确恢复。
答案 5 :(得分: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
}
}
答案 6 :(得分:4)
在最明显的文件中添加每个活动。这将有助于
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
答案 7 :(得分:4)
在清单中为所有应用活动标记添加android:configChanges="keyboardHidden|orientation|screenSize"
。
答案 8 :(得分:3)
只需将其添加到您的AndroidManifest.xml
<activity android:screenOrientation="landscape">
我的意思是,有一个活动标记,将其添加为另一个参数。如果您需要纵向方向,请将横向更改为纵向。希望这会有所帮助。
答案 9 :(得分:3)
以上所有答案都不适用于我。所以,我已经通过提及label
和screenOrientation
来解决问题。现在一切都很好
<activity android:name=".activity.VideoWebViewActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize"/>
答案 10 :(得分:2)
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
答案 11 :(得分:1)
防止重新创建活动 通过在AndroidManifest.xml中的Activity上设置android:configChanges标志来解决方向变化的最常见解决方案。使用此属性,将不会重新创建“活动”,并且在更改方向后所有视图和数据仍将存在。
<activity
android:name="com.example.test.activity.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"/>
这对我有用???
答案 12 :(得分:1)
正如Pacerier所说,
android:configChanges="orientation|screenSize"
答案 13 :(得分:1)
只需使用:android:configChanges="keyboardHidden|orientation"
答案 14 :(得分:1)
将图片详细信息保存在onPause()
或onStop()
中,并在onCreate(Bundle savedInstanceState)
中使用它来恢复图片。
编辑:
有关实际流程的更多信息,请参阅http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle,因为Honeycomb与以前的Android版本不同。
答案 15 :(得分:-1)
在包含onCreate
WebView
方法之后添加此代码
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
答案 16 :(得分:-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);
}
我不知道这是否是最优雅,最漂亮的解决方案,但至少在这里它是有用的:)