【问题标题】:Don't reload application when orientation changes方向改变时不要重新加载应用程序
【发布时间】:2011-05-06 14:50:54
【问题描述】:

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

【问题讨论】:

  • 也可以通过代码锁定(也可能解锁)屏幕方向。为此,只需从github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/… 致电Screen.lockOrientation(this)。它允许解锁清单没有。
  • @Escobar Ceaser 这个问题的正确解决方案是什么。即使我有同样的要求。
  • 我想在代码中以编程方式执行此操作。

标签: android


【解决方案1】:

一般有以下三种方法:

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

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

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

我个人会选择(3)。当然,如果您可以将应用程序锁定到其中一个方向,您也可以使用 (2)。

【讨论】:

  • 那么对于#3,你是说我所要做的就是将该行添加到我的清单中吗?因为它不起作用。
  • @EscobarCeaser,对于Android 3.2及以上,您需要android:configChanges="orientation|screenSize"
  • android:configChanges="orientation|screenSize" 为我工作。谢谢@Pacerier
  • 请用android:configChanges="orientation|screenSize" API >=13 的值更新你的答案案例#3,因为很多人认为你的答案是主要的!
【解决方案2】:

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

在 API 级别 13 或更高版本中,屏幕尺寸会随着方向变化而变化,所以这仍然会导致 Activity 在方向变化时被销毁并启动。

像下面这样简单地添加“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

【讨论】:

  • 谢谢...在添加“screenSize”和“orientation”后的工作
  • 适用于三星 Galaxy Nexus android 4.2.1 ! android:configChanges="orientation|screenSize"
  • 太棒了。一直在研究代码这么多小时来解决我在活动重新加载和从头开始的视频时遇到的问题。这就是解决方案! ++++1
  • 不好的做法? Pfft,现实生活中的人们有最后期限,如果它有效,它就有效;)
  • 如果这是一个不好的做法,那么为什么它会得到如此多的支持??
【解决方案3】:

您只需要转到AndroidManifest.xml 并在您的活动标签内或在您的活动标签中,您必须像上面的人所说的那样键入这行代码:

android:configChanges="orientation|screenSize"

所以,你会得到这样的东西:

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

希望它有效!

【讨论】:

  • 它没有加载我的布局土地布局。 :( 对我不起作用
【解决方案4】:
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

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

因此,当方向改变时,Activity 不会重新启动。

【讨论】:

  • 它的工作。但是当我为每个方向 layout.xml 和 layout-land.xml 使用单独的布局时。它为两个方向应用横向布局。如果我只使用“方向”,它会给出我所期望的但重新加载。你能帮忙吗?
  • @KarthikeyanVe 这就是你试图作弊时的问题。您将必须重新启动您的活动以更改布局。继续使用真正的解决方案,即使用onSaveInstanceState()onCreate()
  • @MarcPlano-Lesay 我该怎么做?
  • @Weaboo 实际解决方案链接在问题中:developer.android.com/guide/topics/resources/…
  • @MarcPlano-Lesay 我有纵向和横向模式的单独布局,如果我以横向或纵向模式打开我的应用程序,它可以正常工作,但是每当我尝试在运行时更改方向时,它都会关闭我的应用程序,但是当我登录到我的应用程序然后导航到 MainActivity 并尝试更改方向时,它会重新加载该活动并正常工作。现在的问题是为什么?我的代码中是否存在逻辑错误? Idk,但我已尝试多次调试该应用程序,但我找不到任何东西。此外,我不想重新启动我的活动,为什么我们不能在配置更改时调整相应的布局?
【解决方案5】:

根据我的经验,最好只正确处理方向更改,而不是试图强行硬起非默认行为。

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

【讨论】:

  • #3 是一个完全有效的解决方案。它是为解决这个确切问题而制作的exact 工具。为什么说它是硬道理?
  • @Pacerier 只需阅读文档。 "注意:应避免使用android:configChanges,仅将其用作最后的手段。请阅读处理运行时更改,了解有关如何正确处理因配置更改而重新启动的更多信息。"跨度>
  • 您能否发布一个保存和恢复的示例。
【解决方案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

    }
}

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      在清单文件中添加到每个活动中。这会有所帮助

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

      【讨论】:

      • screenLayout 为我工作,在 android 上为分屏调整应用程序大小时阻止刷新
      【解决方案9】:

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

      <activity android:screenOrientation="landscape">
      

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

      【讨论】:

      • 我不想取消旋转屏幕的功能。我只是不想让我的应用重新加载...正如我所提到的。
      • ps...这无论如何都行不通。它只是强制应用程序以特定方向显示。旋转屏幕仍然会重新加载活动
      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

        正如 Pacerier 所说,

        android:configChanges="orientation|screenSize"

        【讨论】:

          【解决方案12】:

          以上所有答案都不适合我。所以,我已经通过提到labelscreenOrientation 来修复,如下所示。现在一切正常

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

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              【解决方案14】:

              阻止 Activity 重新创建 通过在 AndroidManifest.xml 中的 Activity 上设置 android:configChanges 标志来处理方向更改的最常见解决方案。使用此属性,您的活动将不会被重新创建,并且您的所有视图和数据在方向更改后仍然存在。

              <activity
                  android:name="com.example.test.activity.MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden"/>
              

              这对我有用???

              【讨论】:

                【解决方案15】:

                将图像详细信息保存在您的onPause()onStop() 中,并在onCreate(Bundle savedInstanceState) 中使用它来恢复图像。

                编辑:

                有关实际过程的更多信息在http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle 中进行了详细说明,因为 Honeycomb 与以前的 Android 版本不同。

                【讨论】:

                • 其实应该在 onSaveInstanceState() 方法中做
                【解决方案16】:

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

                首先,你需要你的类应用程序的证书在你的清单中:

                <application
                    android:name=".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);
                }
                

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

                【讨论】:

                  【解决方案17】:

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

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

                  【讨论】:

                  • 这将如何工作?你不是只是明确地对运行时说些什么,否则默认情况下会做什么?
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-16
                  • 2018-02-11
                  • 1970-01-01
                  • 2013-05-19
                  • 1970-01-01
                  相关资源
                  最近更新 更多