一、ToolBar的风格
1、可以先定义toolbar的风格,并做成独立的资源文件作为公共的页面在每个需要显示相同toolbar的页面的xml中加入类似:<include layout="@layout/toolbar" />
这里定义一个简单的toolbar.xml文件
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/AppTheme" > </androidx.appcompat.widget.Toolbar>View Code
2、在toolbar中增加返回图标、主标题和副标题
mToolbar.setTitle("主标题"); mToolbar.setSubtitle("副标题"); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 在左上角增加一个返回的图标
通过上述1和2的操作,则可以在界面中显示简单的toolbar了
注意:该类继承的是AppCompatActivity
// AppCompatActivity代替了ActionBarActivity public class ToolbarTest extends AppCompatActivity { ....... }
二、在toolbar中加入菜单
这里定义一个简单的menu_main.xml文件
<?xml version="1.0" encoding="utf-8"?> <menu 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" > <item android:id="@+id/ab_search" android:title="action_search" android:orderInCategory="80" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="ifRoom" /> <item android:id="@+id/action_share" android:title="action_share" android:orderInCategory="90" app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider" app:showAsAction="ifRoom" /> <item android:id="@+id/action_setting" android:title="action_setting" android:orderInCategory="100" app:showAsAction="never" /> </menu>View Code
包含了三个item:ab_search、action_share、action_setting
其中搜索的item:app:actionViewClass="androidx.appcompat.widget.SearchView" 则会显示为搜索的图标状态
共享的item:app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider" 则会显示共享的图标状态
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); // return super.onCreateOptionsMenu(menu); }
如上则是将menu_main的资源inflate到menu中
在这里,我们可以对每个item进行自己想要的操作,比如share的操作
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.action_share)); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/*"); shareActionProvider.setShareIntent(intent); return super.onCreateOptionsMenu(menu); }
如上则是将share过滤出包含text/的所有功能,点击share即会列出所有的这些功能
当想监听这几个item的点击事件,有两种方式
第一种:通过mToolbar.setOnMenuItemClickListener()的方式
mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_setting: Toast.makeText(ToolbarTest.this, "action_setting", Toast.LENGTH_SHORT).show(); break; default: break; } return true; } });
但是点击的时候发现没有走进到这个itemclick函数,发现是因为改mToolbar对应的action没有attach本context;
可以通过setSupportActionBar(mToolbar); 进行操作,之后再mToolbar.setOnMenuItemClickListener()
但是在进行setSupportActionBar的时候竟然崩溃了,提示如下的错误
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.agiledeveloper.newfeatures/com.agiledeveloper.newfeatures.ToolbarTest}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
说是这个Activity已经有一个actionbar了,是window decor提供的
解决这个崩溃的方法是在AndroidManifest.xml中,修改android:theme 为另外的一个theme
以这里为例,这里目前默认的是:android:theme="@style/Theme.NewFeatures" , 这边把它改成android:theme="@style/AppTheme" 崩溃即可解决,并且监听也能够监听的到
第二种监听item的点击事件
在onCreateOptionsMenu函数中增加对应的item的点击监听事件,这里以action_setting这个item为例
MenuItem actionMenuItem = menu.findItem(R.id.action_setting); actionMenuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(ToolbarTest.this, "action_setting", Toast.LENGTH_SHORT).show(); return false; } });
如上所示:也可以实现改actionMenuItem的点击事件
三、在toolbar中增加侧滑菜单
如下是完整的toolbar_test.xml的配置
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/toolbar" /> <!--如下是侧滑菜单,使用抽屉显示的方式; drawer_view页面需要设置layout_gravity,这里设置为start--> <!--也可以设置为end或者left或者right;这边咱们看到的start跟left的效果是一样的,但是一些阿拉伯国家他们的start就显示在右边,跟left产生的效果就不一样--> <androidx.drawerlayout.widget.DrawerLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/drawer"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light" android:orientation="vertical"> <Button android:layout_width="100dp" android:layout_height="match_parent" android:text="内容界面"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/drawer_view" android:layout_gravity="start" android:orientation="vertical"> <Button android:layout_width="200dp" android:layout_height="match_parent" android:text="菜单界面" /> </LinearLayout> </androidx.drawerlayout.widget.DrawerLayout> </LinearLayout>View Code
同时在oncreate中增加如下的代码
DrawerLayout drawerLayout = findViewById(R.id.drawer); ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, mToolbar, R.string.app_name, R.string.hello_world); drawerToggle.syncState(); // 用来显示返回三个横杠,之后是一个箭头的返回 drawerLayout.addDrawerListener(drawerToggle); // 建立DrawerLayout和ActionBarDrawerToggle的关联
如果要在菜单栏打开或关闭的时候增加监听,可以如下操作
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, mToolbar, R.string.app_name, R.string.hello_world) { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); } };
标签:mToolbar,menu,安卓,item,action,public,toolbar From: https://www.cnblogs.com/czwlinux/p/17081214.html