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

时间:2011-05-06 14:50:55

标签: android

旋转屏幕时我根本不需要改变任何东西。我的应用在首次加载时显示随机图像,并且选择另一个随机图像时旋转设备。 我怎样(简单地)让这种行为停止?

17 个答案:

答案 0 :(得分:240)

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

  1. 根据建议的一些答案,您可以区分第一次创建活动并从{{​​1}}恢复活动的情况。这是通过覆盖savedInstanceState并检查onSaveInstanceState的参数来完成的。

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

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

  4. 就个人而言,我会选择(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)

以上所有答案都不适用于我。所以,我已经通过提及labelscreenOrientation来解决问题。现在一切都很好

<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);
}

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