【问题标题】:Android Activity being recreate when the starting next activity with different screen orientation当启动具有不同屏幕方向的下一个活动时,正在重新创建 Android 活动
【发布时间】:2012-04-03 09:52:12
【问题描述】:

我发现当我们通过屏幕旋转改变当前activity的方向时,之前的activity会在后台重新创建。

我想说的是,例如:

我已经在清单文件中为这两个活动设置了屏幕方向

<activity android:screenOrientation="portrait" android:name="package.PotraitActivity"></activity>
<activity android:screenOrientation="landscape" android:name="package.MyActivity"></activity>

在 PotraitActivity.java 中,

Button mybutton = (Button)findViewById(R.id.mybutton);
mybutton.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View view) 
  {  Intent intent = new Intent(this,MyActivity.class);
     startActivity(intent);
  }
});

单击 myButton 时,LandscapeActivity 已启动。但同时也调用了 PotraitActivity 中的 OnCreate() 方法。

我发现同样的事情发生在:

  1. 两个活动的屏幕方向不同或
  2. 已为 MyActivity (screenOrientation="user") 启用屏幕旋转。每次旋转 MyActivity 时都会调用 PotraitActivity 中的 OnCreate() 方法。

有人知道这个吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    android:configChanges="orientation" 设置为清单中的 package.PotraitActivity 活动。设置此项将忽略默认的屏幕方向实现,并为您提供手动覆盖它的控制权。

    【讨论】:

    • 即使我设置了 android:configChanges="orientation" 也发生了这种情况...无论如何感谢您的评论 =)
    • 哎呀对不起 Waqas .... 我曾尝试将 android:configChanges="orientation" 添加到 package.PotraitActivity 并且它有效!你能进一步解释为什么它会这样吗?
    • 设置此项告诉框架,如果方向发生变化,您将在代码中手动处理它(加载新布局 - 如果有)
    【解决方案2】:

    在按钮的onclick函数中调用finish()。

     Button mybutton = (Button)findViewById(R.id.mybutton);
    mybutton.setOnClickListener(new OnClickListener() {
    
      @Override
      public void onClick(View view) 
      {  Intent intent = new Intent(this,MyActivity.class);
         startActivity(intent);
         finish();
      }
    });
    

    谢谢...

    【讨论】:

    • 我试过了,它是有效的。你知道为什么不调用finish()就继续重新创建活动吗?据我所知 OnCreate 方法只会在活动首次创建时调用。无论如何感谢您的回答。这对我很有帮助 =)
    • OnCreate 方法只会在活动第一次创建时调用。当我们转到另一个屏幕时它会暂停,当我们再次调用它时它会恢复它。但是如果我们调用finish(),那么活动就会破坏并重新开始。谢谢,如果我的回答对你有帮助,请投票给我..
    【解决方案3】:
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    

    最好在 oncreate() 和清单文件中设置方向,为这两个活动添加这一行

    android:configChanges="keyboardHidden|orientation"

    【讨论】:

      【解决方案4】:

      我最近也遇到过类似的情况,真是令人沮丧。所以我决定在这里写我的解决方案,虽然这是一个老问题。

      有两个activity,activity A和activity B。activity A是一个纵向的普通activity,而用于显示视频的activity B是横向的。

      当 Activity A 启动 Activity B 时会发生奇怪的事情。Activity A 每次启动 Activity B 时都会重新创建自己。

      但是,我写了一个类似的演示,这些事情不会发生。

      我怀疑有什么区别,在原项目的styles.xml中找到了这一行。

      <item name="android:windowIsTranslucent">true</item>
      

      所以我删除了这一行并再次重新启动项目。一切又恢复了正常。

      这是我的猜测: 活动 B 中的 SurfaceView 将在其窗口中打一个洞以显示其表面。加上android:windowIsTranslucent属性,系统判断之前的activity是否可见,重新创建。

      解决方案: 只需删除&lt;item name="android:windowIsTranslucent"&gt;true&lt;/item&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        相关资源
        最近更新 更多