【问题标题】:onConfigurationChanged is not being called the first time I return from another activity我第一次从另一个活动返回时没有调用 onConfigurationChanged
【发布时间】:2012-02-15 00:53:14
【问题描述】:

我有以下问题:当我将手机从纵向更改为横向时,我想要消失的图像。当我正在进行当前活动并移动方向时,它工作得非常好。如果我去参加另一项活动并回来,它也完全可以正常工作。但问题是,在我返回主页后,第一次更改方向时不会调用 onConfigurationChanged()。当我返回时,图像将显示/不正确显示,但是当我在返回后第一次更改方向时,不会调用 onConfigurationChanged() 并且图像将保留/不保留,直到我第二次更改方向。你们的任何帮助将不胜感激! 这是我的代码的几个部分。我已经在清单中放置了 configChange-orientation 权限,所以这不是问题。

    @Override
    public void onConfigurationChanged(Configuration newConfig) {L.p("configList",5200184);
        super.onConfigurationChanged(newConfig);

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE&&isVertical==true) {

            Logo.setVisibility(ImageView.GONE);
            mainLogo.setVisibility(ImageView.GONE);
            isHorizontal=true;

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT&&isHorizontal==true){

            Logo.setVisibility(ImageView.VISIBLE);
            mainLogo.setVisibility(ImageView.VISIBLE);
            isVertical=true;
        }
      }




    @Override
    protected void onResume() {L.p("onResumeList", 5200113);
        super.onResume();
        Context ctx = getApplicationContext();
  WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
  Display display = wm.getDefaultDisplay();

        if((display.getOrientation() == Surface.ROTATION_90) || (display.getOrientation() == Surface.ROTATION_270))
            {//Horizontal
            L.p("you are resuming horizontal",5200124);
            Logo.setVisibility(ImageView.INVISIBLE);
    mainLogo.setVisibility(ImageView.INVISIBLE);    
    isHorizontal=true;
    //isVertical=false;
            }
        else {//Vertical
            L.p("you are resuming vertical",5200131);
    Logo.setVisibility(ImageView.VISIBLE);
    mainLogo.setVisibility(ImageView.VISIBLE);
    isVertical=true;
  //    isHorizontal=false;
    }
        tracker.trackPageView("/deviceList");
    }

谢谢!

【问题讨论】:

  • 我也有同样的问题。你解决了吗?

标签: android orientation screen-orientation orientation-changes onconfigurationchanged


【解决方案1】:

无需覆盖方向更改。只需在layout-land 文件夹中声明一个不包含图像(或图像设置为不可见/消失)的新布局文件。更改方向时,您的活动将在 onCreate 中加载该布局。

【讨论】:

  • 我听说这是不好的做法,但感谢您的提示。我只想知道为什么 onConfigurationChanged() 在我从另一个活动返回后第一次改变方向时没有被调用。如果我将它从水平移动到垂直,图像仍然消失了。但后来我回到水平,然后是垂直,它看起来应该是这样的。
  • 我个人从未听说过 layout-* 文件夹是“不好的做法”。有什么理由认为它是这样的吗?
  • @tdevoy 与使用 configChange 进行黑客攻击相比,制作单独的布局要好得多。
【解决方案2】:

为什么要检查 isHorizo​​ntal 和 isVertical? 是否有可能其中一个是错误的,导致它在 if 条件下失败?

【讨论】:

  • 没有那些绝对可以正常工作。我只是把它们作为额外的保护,在 onResume 之后仔细检查它是否正确地知道之前的方向。一切正常,只是我第一次返回活动并更改手机的方向时,无法识别方向更改,我必须在调用 onConfigurationChanged 之前更改方向两次。不过谢谢,还有其他想法吗?
【解决方案3】:

onConfigurationChanged()方法不会被调用,除非你在AndroidManifest.xml中声明了<activity>下的相应属性:

android:configChanges="orientation"

【讨论】:

  • 是的,这不是问题所在。问题是当我从另一个活动返回时,onConfigurationChanged() 在我第一次改变方向时不会被调用,但之后每次都会被调用。你对此有什么想法吗?
  • 不太确定原因,但是您是否手动设置了 Activity 的方向?如果是这样,该方法也将不会被正确调用。建议你新建一个Android项目,不要放任何代码代替onConfigurationChanged()和startActivity(),这样你就可以观察行为了。
  • 永远不要仅仅因为可以使用 configChange。 plus.google.com/109306462100800920982/posts/LuYGURGdX7Q 在那里查看亚当的精彩评论。在 Android 开发人员停止这样做之前,我不会休息。 @VictorWong
【解决方案4】:

可能是某个地方的标志导致了问题。而且,不幸的是,如果没有看到完整的代码,我们可能永远不会知道问题出在哪里。

但是,请不要使用 configChange hack。 (https://plus.google.com/109306462100800920982/posts/LuYGURGdX7Q 很好地解释了何时可以正常工作的极为罕见的情况。)

很可能,onConfigurationChanged 方法在这里根本不需要被覆盖。为在配置更改时重新创建 Activity 时制作不同的布局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多