compile "com.android.support:appcompat-v7:23.4.0"
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowNoTitle">true</item> <item name="windowActionBar">false</item>第二个属性代表是否用ActionBar代替TitleBar。
android:fitsSystemWindows="true" android:minHeight="?attr/actionBarSize"fitsSystemWindows是ToolBar实现沉浸式状态栏的关键,其大概情况是,如果设为true,就会调整这个view去留一些空间给系统窗口,如果不设置或设为false,ToolBar就会和状态栏重叠在一起。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}无论是ToolBar,还是自定义导航栏,这个操作都是实现沉浸式状态栏的关键。
setSupportActionBar(mToolbar);
<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/tool_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:elevation="4dp" android:fitsSystemWindows="true" android:minHeight="?android:attr/actionBarSize" app:title="ToolBar" app:subtitle="toolbar"/>效果图(Android 6.0):
二、自定义导航栏TopBar
1、设置窗口为无标题,上面第2步中的两个方法都可以实现,或者是在java中添加如下代码:requestWindowFeature(Window.FEATURE_NO_TITLE);
注意在添加这句代码时,确保是在加载布局内容之前,也就是onCreate的setContentView之前。在《Android群英传》“Android控件架构”,这一节中解释了为什么requestWindowFeature()需要在setContentView()之前。
另外,我发现如果该activity是继承AppCompatActivity的话,只写上面的这句代码是没有变化的,显示的还是ActionBar。但如果是继承FragmentActivity的话,就有效果,也就说上面第2步中的第二个方法,只添加其中任意一个属性都是可以的。至于是什么原因,我还没弄清楚。
2、同上面第4步,判断系统版本并按需设置状态栏为透明
3、获取状态栏的高度
protected int getStatusHeight() { try { Class<?> c = Class.forName("com.android.internal.R$dimen"); // 获得与字符串对应的Class对象 Object object = c.newInstance(); // 创建这个Class的实例对象 Field field = c.getField("status_bar_height"); // 拿到字符串对应的变量 int x = Integer.parseInt(field.get(object).toString()); // 通过这个实例对象拿到这个变量的值,再转换类型,最后转为整型,变为一个资源id return getResources().getDimensionPixelSize(x); } catch (Exception e) { e.printStackTrace(); } return 0;}这部分代码是利用Java的反射机制来实现的,因为这个internal包默认会被sdk/platforms/android-version中的android.jar给移除掉,所以无法直接调用或查看这个包中的类。如果要使用的话,可以借助这个开源项目https://github.com/anggrayudi/android-hidden-api。
protected void setStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.top_bar); final int statusHeight = getStatusHeight(); viewGroup.post(new Runnable() {@Overridepublic void run() {int topBarHeight = viewGroup.getHeight();LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) viewGroup.getLayoutParams();layoutParams.height = statusHeight + topBarHeight;viewGroup.setLayoutParams(layoutParams);} }); }}因为在include这个TopBar的布局文件中,其父布局是LinearLayout,而TopBar的父布局是RelativeLayout,所以这里先要转成ViewGroup,等getLayoutParams时,再转成LinearLayout.LayoutParams。
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/top_bar" android:layout_width="match_parent" android:layout_height="49dp" android:background="@color/colorPrimary" android:gravity="bottom"> <RelativeLayout android:layout_width="match_parent" android:layout_height="49dp"> <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="@string/app_name"android:textSize="24sp"android:textColor="#ffffff"/> </RelativeLayout></RelativeLayout>因为这个布局的高度会在代码中动态地修改,即49dp加上状态栏的高度,所以只有一个层级的结构的话,那导航栏的内容就会往上偏。所以要嵌套多一层来维持导航栏的高度,同时在最外层的布局中,添加android:gravity="bottom"这个属性来保证导航栏不往上偏。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!