Toolbar and DrawerLayout

Toolbar

去掉actionbar的方式

  • supportRequestWindowFeature(Window.FEATURE_NO_TITLE)用于AppCompatActivity继承的Activity去除actionbar,在onCreate方法的setContentView(R.layout.activity_main)方法之前.(RequestWindowFeature(Window.FEATURE_NO_TITLE)用于Activity的继承类,Activity继承类默认没有actionbar)
  • 在styles.xml文件中配置无actionbar主题
      <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
  • 对于特定的Activity,也可以在manifest文件中进行配置
    <activity
         android:name=".MainActivity"
         android:label="@string/app_name"
         <!-- 这行代码便可以隐藏 ActionBar -->
         <android:theme="@android:style/Theme.Light.NoTitleBar" >
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
    </activity>

toolbar使用

toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

关于include标签的说明

  • 在include标签中不包含id,例如<include layout="@layout/toolbar_layout"/>,那么直接可以根据layout布局的id进行findViewById,需要注意的是,当多个include标签内包含相同id的时候,只会找到第一个id控件
  • 当include标签中包含id的时候,例如下图中include标签的id是include_toolbar.
  <include
            android:layout_width="match_parent"
            android:id="@+id/include_toolbar"
            layout="@layout/toolbar_layout"
            android:layout_height="wrap_content" />

toolbar_layout文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:elevation="4dp"
    android:background="@color/colorPrimary">

    <TextView
        android:id="@+id/toolbar_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="标题"
        android:textColor="@android:color/white" />

</android.support.v7.widget.Toolbar>
在这种情况下,如果想要找到toolbar控件,include的id进行findViewById直接返回最外层控件view,然后根据最外层控件view,进行findViewById寻找其他内层控件id.
        Toolbar toolbar =  findViewById(R.id.include_toolbar);//include的id直接返回layout布局中最外层控件
        TextView toolbar_title = toolbar.findViewById(R.id.toolbar_title);//根据最外层控件寻找layout中的其他id
        toolbar_title.setText("我的标题");



toolbar的常用操作

  • 几个属性. title,subtitle,logo,navigationIcon,通过向toolbar布局中添加textview实现标题在中间的效果
  • Toolbar setNavigationIcon无效原因: 1.设置在setSupportActionBar( mToolbar )之前无效; 2.设置在DrawerLayout.setDrawerListener(ActionBarDrawerToggle);之前也无效.Toolbar.setNavigationClickListener同样适用本规则
  • getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示一个返回的小箭头,系统默认id为 android.R.id.home.设置这个箭头的监听事件可以有两种方式: 
    • 在onOptionsItemSelected方法中根据系统id 设置响应事件
       public boolean onOptionsItemSelected(MenuItem item) {
      
          switch (item.getItemId()) {
              case android.R.id.home:
                  Toast.makeText(MainActivity.this, "home", Toast.LENGTH_SHORT).show();
                  break;
          }
          return true;
      }
    • 如果当前的actionbar采用的是toolbar,此时的home图标也是navigation图标,可以通过setNavigation的监听事件来设置返回功能,如果设置了该监听方法,上面的onOptionsItemSelected不再生效.
      toolbar.setNavigationOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Toast.makeText(MainActivity.this, "navigation", Toast.LENGTH_SHORT).show();
         }
      });
  • 关于设置logo的方法getSupportActionBar().setDisplayShowHomeEnabled(true)和title的方法getSupportActionBar().setDisplayShowTitleEnabled(false);
     getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示一个返回的小箭头
    
            /**
            *是否显示默认logo,该设置会使得
            *getSupportActionBar().setLogo(R.drawable.ic_launcher_background)方法无效,
            *但是该方法完全不影响toolbar.setlogo,该方法设定后始终生效
            **/
            getSupportActionBar().setDisplayShowHomeEnabled(true);
            getSupportActionBar().setLogo(R.drawable.ic_launcher_background);
            toolbar.setLogo(R.mipmap.ic_launcher);
    
            /**
            *是否显示系统默认的title,默认为true,如果调用getSupportActionBar().setTitle("title");
            *那么该方法会变为false,这时调用toolbar.settitle会生效.
            *如果想通过toolbar.settitle方法直接设定标题,这个Enable方法应该设定为false
            **/
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            getSupportActionBar().setTitle("这是");
            toolbar.setTitle("这是label");

DrawerLayout

drawerLayout的使用

  • 需要在Gradle中先引入 implementation 'com.android.support:design:26.1.0',这句话可以引入

    • DrawerLayout
    • NavigationView
    • CoordinatorLayout
    • AppBarLayout
    • Toolbar
    • TabLayout
    • FloatingActionButton
  • Activity中的代码

     private DrawerLayout drawerLayout;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    //        getSupportActionBar().setHomeButtonEnabled(true);
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);//是否一个返回的小箭头
    
            /**
             *下方这行代码设置是否显示默认logo,
             * 该设置会使得getSupportActionBar().setLogo(R.drawable.ic_launcher_background)方法无效
             * 但是该方法完全不影响toolbar.setlogo
             */
            getSupportActionBar().setDisplayShowHomeEnabled(true);
            //getSupportActionBar().setLogo(R.drawable.ic_launcher_background);//几乎和下一句等效
            toolbar.setLogo(R.mipmap.ic_launcher);
    
            /**
             * 下方这行代码设置是否显示系统默认的title,默认为true
             * 如果调用getSupportActionBar().setTitle("title")那么该方法会变为false,
             * 如果想通过toolbar.setTitle方法直接设定标题,这个方法应该设定为false,
             * 如果该方法为true,并且没有调用getSupportActionBar().setTitle("这是"),那么toolbar.setTitle会失效
             */
            getSupportActionBar().setDisplayShowTitleEnabled(true);
            getSupportActionBar().setTitle("这是");
            toolbar.setTitle("这是label");
    
    
            /**
             * 下方这四行代码会给toolbar添加默认的drawerLayout导航图标
             * toolbar关于navigation的设置应该在这几行之后,设置才能生效
             */
            drawerLayout = findViewById(R.id.drawerLayout);
            ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.app_name, R.string.app_name);
            drawerLayout.addDrawerListener(toggle);
            toggle.syncState();
    
            NavigationView navigationView = findViewById(R.id.drawer_navigation_view);
            navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    if(drawerLayout.isDrawerOpen(Gravity.START)){
                        drawerLayout.closeDrawer(Gravity.START);
                    }
                    return true;
                }
            });
        }
    
        //关闭左侧导航视图
        @Override
        public void onBackPressed() {
            DrawerLayout drawer = findViewById(R.id.drawerLayout);
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                super.onBackPressed();
                drawer.openDrawer(GravityCompat.START);
            } else {
                super.onBackPressed();
            }
        }
  • 布局

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/drawerLayout"
        tools:context="com.chenggong.toolbartest.MainActivity">
    
        <!--正常布局,drawerLayout必须只有两部分,上部分是正常界面布局,下部分是抽屉布局-->
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <include layout="@layout/toolbar_layout" />
        </RelativeLayout>
    
        <!--抽屉布局-->
        <android.support.design.widget.NavigationView
            android:id="@+id/drawer_navigation_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#ffffff"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/header_layout"
            app:menu="@menu/navigation">
    
        </android.support.design.widget.NavigationView>
    </android.support.v4.widget.DrawerLayout>

猜你喜欢

转载自blog.csdn.net/followYouself/article/details/80725250