在我的应用程序中,我将这些标志用于全屏视频。在用户交互中,我显示了导航/状态/工具栏。我正在使用带有工具栏的新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上。
答案 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。布局应该处理任何额外的填充并为其着色。