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(); } });
- 在onOptionsItemSelected方法中根据系统id 设置响应事件
- 关于设置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>