【问题标题】:android activity restarted when orientation changes方向改变时android活动重新启动
【发布时间】:2012-07-01 08:49:29
【问题描述】:

我阅读了许多有关此问题的帖子,例如 [此链接][1],一种解决方案是将方向配置更改添加到清单并处理 onConfigurationChanged 事件,以防止在旋转时再次调用 onCreate 活动。我做到了,事件被正确触发,但是,在执行之后,onCreate方法也被执行了!为什么?我错过了什么?谢谢

清单,

<activity 
            android:name="webPush"
            android:configChanges="keyboardHidden|orientation"/>

活动,

@Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      setContentView(R.layout.vistaaib);
    }

@Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.vistaaib);
...

【问题讨论】:

    标签: java android eclipse


    【解决方案1】:

    我认为这会奏效............

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

    从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,如果您想防止在为 API 级别 13 或更高级别进行开发时由于方向更改而导致运行时重新启动,您必须使用

    android:configChanges="orientation|screenSize"
    

    【讨论】:

    • 在 onConfigChanges 事件后仍然触发 onCreate
    • 你在AndroidManifest文件中需要阻止调用onCreate()的activity下有没有提到这个
    • 是的,正如发布的那样,webPush 是需要阻止其 onCreate 方法的活动
    • 找到了! webPush 类在 tabHost 内,所以我必须防止 tabHost 类的旋转!改变和工作。感谢您向内看!
    【解决方案2】:

    我做到了。 我将此代码添加到清单中,并且效果很好。

    <activity
            android:name="?"
            android:label="@string/?"
            android:theme="@style/?" 
            android:configChanges="orientation|screenSize">
    

    如果您想在设备旋转时更改某些内容,则需要在您的活动下添加此内容。

    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }
    

    【讨论】:

      【解决方案3】:

      在该 Activity 的清单文件中写入这两行代码。

      看来这会解决你的问题。<activity android:name=".YourActivity" android:configChanges="orientation|keyboardHidden"/>

      【讨论】:

      • 在 onConfigChanges 事件后仍然触发 onCreate
      【解决方案4】:

      您的活动将在任何配置更改时重新启动。很可能它正在重新启动,因为键盘状态发生了变化。尝试将其添加到活动的属性中:

      android:configChanges="orientation|keyboard|keyboardHidden"
      

      【讨论】:

      • 在 onConfigChanges 事件后仍然触发 onCreate
      • 如果您希望在针对 API 级别 13 或更高级别进行开发时防止由于方向更改而导致运行时重新启动,则除了“orientation”值之外,还必须包含“screenSize”值。也就是说,你必须声明 android:configChanges="orientation|screenSize"
      【解决方案5】:

      如果您正在为 API 级别 12 或更低级别工作

      在清单文件中,在声明您的活动名称之后添加以下内容。

          android:configChanges="orientation"
      

      例如-

          <activity
              android:name=".NameOfYourActivity"
              android:configChanges="orientation"/>
      

      在 android 3.2(API 级别 13)或更高版本中,屏幕尺寸也会随着旋转变化而变化,因此也要声明。

      为此,

          android:configChanges="orientation|screenSize"
      

      【讨论】:

        【解决方案6】:

        以下可能是原因

        事件:screenSize

        当前可用的屏幕尺寸已更改。这表示当前可用尺寸相对于当前纵横比的变化,因此当用户在横向和纵向之间切换时会发生变化。但是,如果您的应用程序以 API 级别 12 或更低级别为目标,那么您的 Activity 始终会自行处理此配置更改(此配置更改不会重新启动您的 Activity,即使在 Android 3.2 或更高版本的设备上运行时也是如此)。 在 API 级别 13 中添加。

        所以除了“orientation”还要加上“screenSize”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-07
          • 2016-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多