Answers:
通常有三种方法可以做到这一点:
正如一些答案所建议的那样,您可以区分首次创建活动并从中恢复活动的情况savedInstanceState。这是通过覆盖onSaveInstanceState和检查的参数来完成的onCreate。
您可以通过在清单中添加android:screenOrientation="portrait"(或"landscape")来将活动锁定在一个方向<activity>。
您可以通过android:configChanges="orientation|screenSize"在<activity>标签中指定,告诉系统您打算自己处理屏幕更改。这样,将不会重新创建活动,而是会收到回调(您可以忽略该回调,因为它对您没有用)。
我个人会选择(3)。当然,如果将应用程序锁定为一种方向就可以了,那么您也可以选择(2)。
android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"为我工作。感谢@Pacerier
android:configChanges="orientation|screenSize"API> = 13的值更新您的答案案例#3 ,因为很多人认为您的答案是主要答案!
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
android:configChanges="orientation|screenSize"
您只需要转到AndroidManifest.xml和内部或活动标签中,就必须输入此行代码,就像有人在上面说的那样:
android:configChanges="orientation|screenSize"
因此,您将获得以下内容:
<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>
希望它能起作用!
<activity android:name="com.example.abc"
android:configChanges="orientation|screenSize"></activity>
只需添加 android:configChanges="orientation|screenSize"清单文件的活动标签即可。
因此,方向更改后,“活动”将不会重新启动。
onSaveInstanceState()和onCreate()。
根据我的经验,实际上最好是正确地处理方向变化,而不是试图冒犯非默认行为。
您应该保存当前正在显示的图像,onSaveInstanceState()并在应用程序onCreate()再次运行时正确还原它。
android:configChanges应避免使用,并且只能将其用作最后一种手段。请阅读处理运行时更改以获取有关如何正确处理由于配置更改而导致的重新启动的更多信息。”
到目前为止,此解决方案是最佳的解决方案。在清单文件中添加
<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
}
}
android:configChanges="keyboardHidden|orientation|screenSize"为清单中的所有应用活动标签添加。
在清单文件中将此添加到每个活动中。这会有所帮助
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
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;
}
将图片详细信息保存到onPause()或中onStop(),然后在中使用它onCreate(Bundle savedInstanceState)来还原图片。
编辑:
有关实际流程的更多信息,请参见http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle,因为它在Honeycomb中与以前的Android版本不同。
只需使用: android:configChanges="keyboardHidden|orientation"
我不知道最好的解决方案,但是我在这里描述:
首先,您需要在课程中获得证书:
<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);
}
我不知道这是否是最优雅,最漂亮的解决方案,但至少在这里它是有用的:)
onCreate在您的活动中的方法之后,添加此代码,其中包含WebView
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
Screen.lockOrientation(this)从github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…进行调用即可。它允许解锁清单没有的。