迁移到api 21工具栏后,我的全屏活动状态栏覆盖了我的工具栏

时间:2015-01-27 00:13:13

标签: android android-5.0-lollipop android-toolbar

在我的应用程序中,我将这些标志用于全屏视频。在用户交互中,我显示了导航/状态/工具栏。我正在使用带有工具栏的新api 21 AppCompat。

这些是我在显示栏时使用的标志:

int newVis = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE

然后致电:

mDecorView.setSystemUiVisibility( newVis );

在迁移到L工具栏之前有效。据推测,现在工具栏部分由状态栏覆盖,因为它是活动布局的一部分。我想我可以将工具栏向下移动一个等于状态栏高度的静态量,但感觉很糟糕。有没有正确的方法来实现这个目标?

我的应用程序支持android 4.1+。就像我说的那样,在我开始使用工具栏之前没有发生,但它确实发生在android 4.1 - 5.0上。

3 个答案:

答案 0 :(得分:2)

最后,修复包括进行一些测量以确定操作栏和导航栏的大小。因为在横向的手机大小的设备上,软导航栏最终位于显示器的右侧,并且还覆盖了工具栏。下面的修复至少应该在android api-16到api-21上运行。代码的后半部分就是重置工具栏的服装,由于某种原因,操作栏中的代码图标最终没有正确对齐(它们更接近顶部)。希望这有助于其他人。

// Get the root activity layout id
            RelativeLayout root = (RelativeLayout) findViewById( R.id.container );
            root.post( new Runnable()
            {
                public void run()
                {
                    Point size = new Point();
                    Display display = getWindowManager().getDefaultDisplay();
                    if ( Integer.valueOf( android.os.Build.VERSION.SDK ) >= Build.VERSION_CODES.JELLY_BEAN_MR1 )
                    {
                        // This is only available on api 17 and higher
                        display.getRealSize( size );
                    }
                    else
                    {
                        // On api 16 and less this should work
                        display.getSize( size );
                    }

                    int screenWidth = size.x;

                    Rect rect = new Rect();
                    Window win = getWindow();  // Get the Window
                    win.getDecorView().getWindowVisibleDisplayFrame( rect );
                    // Get the height of Status Bar 
                    int statusBarHeight = rect.top;
                    int navBarWidth = screenWidth - rect.width();

                    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mToolbar.getLayoutParams();

                    android.util.TypedValue value = new android.util.TypedValue();
                    getTheme().resolveAttribute( android.R.attr.actionBarSize, value, true );
                    TypedValue.coerceToString( value.type, value.data );
                    android.util.DisplayMetrics metrics = new android.util.DisplayMetrics();
                    getWindowManager().getDefaultDisplay().getMetrics( metrics );
                    params.height = (int) value.getDimension( metrics );

                    params.setMargins( 0, statusBarHeight, navBarWidth, 0 );
                    mToolbar.setLayoutParams( params );
                }
            } );

root.post(Runnable ...)部分也是因为我们无法在oncreate完成之前测量窗口。

答案 1 :(得分:0)

我解决了它添加了一个framelayout(height @ dimen / statusbarheight)。然后,您可以为每个版本和模式设置高度。

一些例子:attrs.xml:

<dimen name="statusbarheight">0dp</dimen>

attrs.xml v21:

<dimen name="statusbarheight">25dp</dimen>

attrs.xml v21 land:

<dimen name="statusbarheight">0dp</dimen>

当我在样式中设置半透明导航栏时,我遇到了同样的问题。

答案 2 :(得分:0)

我认为你在KITKAT上遇到了类似的问题。请参阅DrawInsetsFrameLayout gist by Roman Nurik。布局应该处理任何额外的填充并为其着色。