关于android:当方向改变时不要重新加载应用程序

Don't reload application when orientation changes

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


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

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

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

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

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


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

    在API级别13或更高级别,当方向更改时,屏幕大小会更改,因此这仍会导致活动在方向更改时被销毁并启动。

    只需添加"screenSize"属性,就像我在下面所做的那样:

    1
    2
    3
    4
    <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


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

    1
    android:configChanges="orientation|screenSize"

    所以,你会有这样的事情:

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

    希望它有效!


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

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

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


    根据我的经验,实际上更好地处理方向更改而不是试图窃取非默认行为。

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


    这个解决方案是迄今为止最好的解决方案。在您的清单文件中添加

    1
    2
    3
    4
    5
    6
    <activity
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:name="your activity name"
        android:label="@string/app_name"
        android:screenOrientation="landscape">
      </activity

    在您的活动类中添加以下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @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

        }
    }


    在最明显的文件中添加每个活动。这会有所帮助

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


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


    以上所有答案都不适合我。所以,我已经通过提及labelscreenOrientation修复如下。现在一切都很好

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

    只需将其添加到AndroidManifest.xml即可

    1
     

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


    http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @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;

    }


    正如Pacerier所说,

    android:configChanges="orientation|screenSize"


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


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

    编辑:

    有关实际过程的更多信息,请参阅http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle,因为它在Honeycomb中与以前的Android版本不同。


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);    
    }

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