强制全屏活动重新测量/重绘简历?

时间:2010-12-01 20:02:33

标签: java android

已编辑以添加更多详细信息: (最近两个月前问过......还没有找到解决方案)

我的活动有点复杂的观点。在技​​术意义上并不复杂......只有很多事情要发生。此特定应用程序中的所有活动都设置为FullScreen NoTitleBar,并且它们都设置为横向方向。在应用程序被隐藏然后恢复的过程中,我注意到在开发的早期阶段,布局不经常垂直向下滑动,就好像为标题栏和状态栏腾出空间一样。

稍后在开发中,该应用程序现在调用各种外部意图。我现在注意到,当从外部处理的触发意图(例如创建“选择器”意图或选择图像)恢复时,更倾向于进行相同的转换。我能够使用完全相同的步骤不一致地重现它...有时它有时会发生。似乎在测量和布局的各个阶段之间存在竞争条件。我假设系统正在为我做的其中一个步骤是检查全屏和notitlebar,并进行必要的转换。在某些情况下可能会发生这种情况。

我放了一堆日志记录,并调用了invalidate(),requestLayout()等尝试捕获竞争条件,但问题似乎在我的布局之外。我的根布局的top()和bottom()值分别始终为0和屏幕的高度,即使我在问题发生时记录这个值。

是否有其他方法的Window,WindowManager或任何其他系统视图相关的对象,我可以强制完全重新测量,重绘,重新检查当前的主题/样式标志?

8 个答案:

答案 0 :(得分:9)

我有完全相同的问题,并尝试了几个aproches(如上所述)。 他们都没有工作。但是我找到了以下解决方法:

 protected void onResume() {
   super.onResume();
   handler.postDelayed(new Runnable() {
      public void run() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
      }
   }, 1000);    
 }

视图会在此过程中做一个短暂的闪烁,但至少它不会保持歪曲。 仍然需要找到一个干净的解决方案。然而,这支持了你的论点,即存在某种时间或种族问题。

答案 1 :(得分:1)

在我的情况下,此行为是由锁屏恢复触发的。不知道为什么但是在添加空的重载函数之后它被修复了(但我只在我的HTC Wilfire上测试过它)。这可能是一个不同的错误。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    /* Workaround a probable Android bug with fullscreen activities:
     * on resume status bar hides and black margin stays, 
     * reproducible half of the time when coming back from lock screen 
     * (tested on HTC Wildfire)
     * No idea why but this empty overload method fixed it.
     */
}

答案 2 :(得分:0)

我不确定它是否有效,但您可能想尝试使用该方法:

this.getWindow().getDecorView().invalidate();

如果它本身不起作用,请尝试在onDraw(Canvas)方法中添加删除标题栏所需的说明,并在启动时执行类似的调整。

希望有所帮助。

答案 3 :(得分:0)

嘿嘿, 我有同样的问题。我通过在清单XML中设置这些选项来修复它(似乎API接口有点儿错误)。详情请见http://thedevelopersinfo.wordpress.com/2009/10/21/making-an-fullscreen-activity/

opticron

答案 4 :(得分:0)

您是否在清单或代码中设置了FullScreen NoTitleBar? 如果你使用代码,它可能会在你的代码启动之前被渲染?

<application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

我了解您可以在应用程序中为各个活动设置主题。你呢?它们是否与您的应用程序设置冲突?

答案 5 :(得分:0)

您是否在onResume()中尝试了这个?

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                                WindowManager.LayoutParams.FLAG_FULLSCREEN );

答案 6 :(得分:0)

我找到了解决方法:

    @Override
    protected void onResume() {
        Log.e("", "onResume");
        super.onResume();

        //this is a simple Splash with "Game paused" Text inside! in my main.xml
        final LinearLayout gamePause_text = (LinearLayout) findViewById(R.id.gamePause_text);
        OnGlobalLayoutListener asdf = new OnGlobalLayoutListener(){
            public void onGlobalLayout() {
                Log.e("", "onGlobalLayout");
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                     WindowManager.LayoutParams.FLAG_FULLSCREEN);
                gameSurface.onResume(); //OpenGL Surface onResume();
                gamePause_text.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        };
        gamePause_text.getViewTreeObserver().addOnGlobalLayoutListener(asdf);
    }

答案 7 :(得分:0)

我通过设置应用程序的主题而不是单个活动来修复它。

<application
        android:icon="@drawable/icon"
        android:installLocation="auto"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >

这对我有用。如果我们启动的下一个活动不是全屏活动而当前活动是全屏活动,则会出现此问题。