安卓-toolbar
一、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>
2、在toolbar中增加返回图标、主标题和副标题
mToolbar.setTitle("主标题"); mToolbar.setSubtitle("副标题"); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 在左上角增加一个返回的图标
通过上述1和2的操作,则可以在界面中显示简单的toolbar了
注意:该类继承的是AppCompatActivity
// AppCompatActivity代替了ActionBarActivity public class ToolbarTest extends AppCompatActivity { ....... }
3、setDisplayHomeAsUpEnabled(true)添加后退按钮之后,点击后退按钮没有相应
查找原因发现后发现是因为在AndroidManifest.xml中,该activity没有指定对应的父activity: 如:ToolbarTest:<activity android:name=".ToolbarTest" android:parentActivityName=".MainActivity" />
如果不在activity中设置父亲activity,也可以在代码中增加如下:
@Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == android.R.id.home) { onBackPressed(); return true; } return super.onOptionsItemSelected(item); }
二、在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>
包含了三个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>
同时在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); } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库