Android 自定义ToolBar详细使用
自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用
1.ToolBar布局
<?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/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:focusable="true" android:focusableInTouchMode="true" android:background="@color/color_bg_toolbar"> <ImageView android:id="@+id/title_back" android:layout_width="wrap_content" android:layout_height="match_parent" android:visibility="gone" android:src="@mipmap/ic_back"/> <TextView android:id="@+id/title_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:layout_gravity="center_horizontal" android:textSize="20sp" android:textColor="@color/color_bg_write" android:text="@string/app_name"/> <TextView android:id="@+id/title_rightTv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:layout_marginRight="10dp" android:layout_gravity="right" android:textColor="@color/color_bg_write" android:text="@string/app_name" android:visibility="gone"/> </android.support.v7.widget.Toolbar>
2.menu文件(title右侧图标,测试发现最多只能显示三个,如果超过三个第三个会变成更多的选项),另一种方式就是像上边那样在xml布局里写在Toolbar标签里
app:showAsAction="never" 显示在右侧更多的下拉菜单(三个黑点)
<?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"> <!--扫描--> <item android:id="@+id/title_scan" //id android:title="@string/scan" //title长按显示的文字 android:visible="false" //默认全部不显示 android:icon="@mipmap/ic_scan" //图标 app:showAsAction="ifRoom"/> <!--添加--> <item android:id="@+id/title_add" android:title="@string/add" android:icon="@mipmap/ic_add" app:showAsAction="ifRoom"/> <!--设置--> <item android:id="@+id/title_setting" android:title="@string/setting" android:visible="false" android:icon="@mipmap/ic_setting" app:showAsAction="ifRoom"/> <!--搜索--> <item android:id="@+id/title_search" android:title="@string/search" android:visible="false" android:icon="@mipmap/ic_search" app:showAsAction="ifRoom"/> <!--日期--> <item android:id="@+id/title_date" android:title="@string/date" android:visible="false" android:icon="@mipmap/ic_calendar" app:showAsAction="ifRoom"/> <!--刷新--> <item android:id="@+id/title_refresh" android:title="@string/refresh" android:visible="false" android:icon="@mipmap/botton_refresh" app:showAsAction="ifRoom"/> <!--<item android:id="@+id/title_more1"--> <!--android:title="@string/right2"--> <!--app:showAsAction="never"/>--> <!--<item android:id="@+id/title_more2"--> <!--android:title="@string/right2"--> <!--app:showAsAction="never"/>--> </menu>
只有android:title没有icon则直接显示文字
改变文字颜色,修改style.xml文件(theme)
<item name="actionMenuTextColor">#ffffff</item>
3.BaseActivity
/** * Created by Administrator on 2016/9/5 0005. */ public class BaseActivity extends AppCompatActivity implements View.OnClickListener, Toolbar.OnMenuItemClickListener { /*Toolbar*/ private Toolbar toolBar; /**/ private CoordinatorLayout coordinatorLayout; /*是否第一次加载图标(主要针对首页一对多fragment)*/ private boolean title_menu_first = true; /*是否第一次加载返回*/ private boolean title_back_first = true; /*是否是返回(有可能是代表别的功能)*/ private boolean is_title_back = true; /*返回*/ private ImageView titleBack; /*标题名称*/ private TextView titleName; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //竖屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setRootView(); // coordinatorLayout = getView(R.id.coordinatorLayout); initToolbar(); initWidght(); } protected void setRootView(){} protected void initWidght(){}; // protected <T extends View>T getView(int resourcesId){ return (T) findViewById(resourcesId); }/*初始化toolbar*/ private void initToolbar(){ toolBar = getView(R.id.toolbar); toolBar.setTitle(""); toolBar.setTitleTextColor(Color.WHITE); titleName = getView(R.id.title_name); // setSupportActionBar(toolBar); } /** * 设置返回 * @param back :是否返回:是-->返回,不是则设置其他图标 * @param resourcesId :图标id,返回时随意设置,不使用 * */ protected void setTitleBack(final boolean back,int resourcesId){ is_title_back = back; if (title_back_first || titleBack == null){ titleBack= getView(R.id.title_back); titleBack.setOnClickListener(this); title_back_first = false; } titleBack.setVisibility(View.VISIBLE); if (!back){ titleBack.setImageResource(resourcesId); } } /** * 设置title * @param title :title * */ protected void setTitleName(String title){ titleName.setText(title); } /** * title右侧:图标类 * */ protected void setRightRes(){ //扩展menu toolBar.inflateMenu(R.menu.base_toolbar_menu); //添加监听 toolBar.setOnMenuItemClickListener(this); } /** * 显示title图标 * @param itemId :itemId :图标对应的选项id(1个到3个),最多显示3两个 * */ protected void showTitleRes(int... itemId){ if (title_menu_first){ setRightRes(); title_menu_first = false; } for (int item:itemId){ //显示 toolBar.getMenu().findItem(item).setVisible(true);//通过id查找,也可以用setIcon()设置图标 // toolBar.getMenu().getItem(0).setVisible(true);//通过位置查找 } } /** * 隐藏title图标 * @param itemId :图标对应的选项id * */ protected void goneTitleRes(int... itemId){ if (titleBack != null) titleBack.setVisibility(View.GONE); for (int item:itemId){ //隐藏 toolBar.getMenu().findItem(item).setVisible(false); } } /** * title右侧文字 * @param str :文字内容 * */ protected void setTitleRightText(String str){ TextView textView = getView(R.id.title_rightTv); textView.setVisibility(View.VISIBLE); textView.setText(str); textView.setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.title_back && is_title_back){ onBackPressed(); } } //toolbar菜单监听 @Override public boolean onMenuItemClick(MenuItem item) { return false; } }
3.Activity使用
public class MainActivity extends BaseActivity{ @Override protected void setRootView() { super.setRootView(); setContentView(R.layout.activity_main); } @Override protected void initWidght() { super.initWidght(); setTitleName(getResources().getString(R.string.chat));//title // setTitleBack(false,R.mipmap.ic_search);//有图标,但不是返回 //setTitleBack(true,0);//返回 // setTitleRightText("保存");//右侧文字 showTitleRes(R.id.title_add,R.id.title.setting);//扩展menu(图标) //goneTitleRes(R.id.title_add);隐藏图标,一般用不到 } @Override public void onClick(View v) { if (v.getId() == R.id.title_back){ workFragment.titleSearch(); } } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()){ case R.id.title_add://添加 break; case R.id.title_apps://应用break; case R.id.title_setting://设置 break; } return super.onMenuItemClick(item); } }
Toolbar其他设置
1.去掉左边空白,在style文件里设置
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorAppTheme</item> <item name="colorPrimaryDark">@color/colorAppTheme</item> <item name="colorAccent">@color/colorAccent</item> <item name="toolbarStyle" tools:ignore="NewApi">@style/MyToolBar</item> </style> <style name="MyToolBar" parent="Widget.AppCompat.Toolbar"> <!--左边边距--> <item name="contentInsetStart">0dp</item> </style>
本文来自博客园,作者:西瓜皮不甜,转载请注明原文链接:https://www.cnblogs.com/Jieth/p/5844469.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库