[置顶] xamarin android toolbar(踩坑完全入门详解)
网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费。如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到这篇文章,说明还是搜了xamarin android toolbar。那么这篇文章就好好总结一下toolbar在xamarin android中如何使用,减少大家踩坑的时间。
了解Toolbar
xamarin android中使用Toolbar
写第一个Toolbar例子,然后我们看一下布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/color_white"
- android:fitsSystemWindows="true">
- <android.support.v7.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="60dp"
- android:background="@color/color_primary"
- android:navigationIcon="@drawable/icon2"
- android:logo="@drawable/icon"
- android:subtitle="子标题"
- android:title="标题"
- android:titleTextColor="@color/color_white">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="自定义文本">
- </TextView>
- </android.support.v7.widget.Toolbar>
- </LinearLayout>
记得在Activity继承AppCompatActivity,现在运行的结果是并没有看到标题、子标题、logo等属性。
- <style name="AppTheme" parent="AppTheme.Base">
- </style>
- <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
- </style>

往下看怎么解决。
坑1:设置Toolbar属性不能使用android:**** 而使用app:*****
- <android.support.v7.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="60dp"
- android:background="@color/color_primary"
- android:navigationIcon="@drawable/icon2"
- android:logo="@drawable/icon"
- android:subtitle="子标题"
- android:title="标题"
- android:titleTextColor="@color/color_white">
现在我们能看到已经设置白色的标题文本,navigationIcon、logo、子标题。但是尴尬的是子标题的颜色subTitleTextColor属性报错,虽然可以通过代码SetSubtitleTextColor方法设置,但是这个子标题文本颜色这个subTitleTextColor属性不能通过编译有点难以理解。后来才发现subTitleTextColor属性Title要小写,jbwy,也就是这样app:subtitleTextColor
添加ActionMenu 菜单项
- <?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/menu_edit"
- android:icon="@drawable/edit"
- android:title="编辑"
- app:showAsAction="ifRoom"/>
- <item android:id="@id/menu_search"
- android:icon="@drawable/search"
- android:title="搜索"
- app:showAsAction="ifRoom"/>
- <item android:id="@id/menu_add"
- android:icon="@drawable/add"
- android:title="添加"
- app:showAsAction="ifRoom"/>
- </menu>
MainActivity代码如下:
- using Android.App;
- using Android.Views;
- using Android.Widget;
- using Android.OS;
- using Android.Support.V7.App;
- namespace ToolbarDemo
- {
- [Activity(Label = "ToolbarDemo", MainLauncher = true, Icon = "@drawable/icon",Theme ="@style/AppTheme")]
- public class MainActivity : AppCompatActivity
- {
- protected override void OnCreate(Bundle bundle)
- {
- base.OnCreate(bundle);
- SetContentView(Resource.Layout.Main);
- Android.Support.V7.Widget.Toolbar toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
- toolbar.InflateMenu(Resource.Menu.actionMenu); //填充actionMenu菜单项
- toolbar.MenuItemClick += (s, e) => //菜单项单击事件
- {
- switch (e.Item.ItemId)
- {
- case Resource.Id.menu_add:
- Toast.MakeText(this, "添加菜单项", ToastLength.Short).Show();
- break;
- case Resource.Id.menu_edit:
- Toast.MakeText(this, "编辑菜单项", ToastLength.Short).Show();
- break;
- case Resource.Id.menu_search:
- Toast.MakeText(this, "搜索菜单项", ToastLength.Short).Show();
- break;
- }
- };
- }
- public override bool OnCreateOptionsMenu(IMenu menu)
- {
- return base.OnCreateOptionsMenu(menu);
- }
- }
- }
- always:使菜单项一直显示在ToolBar上。
- ifRoom:如果有足够的空间,这个值会使菜单项显示在ToolBar上。
- never:使菜单项永远都不出现在ToolBar上,在…的子项中显示。
- withText:使菜单项和它的图标,菜单文本一起显示。
坑2:toolbar中使用setSupportActionBar方法菜单项不见了
- public override bool OnCreateOptionsMenu(IMenu menu)
- {
- MenuInflater.Inflate(Resource.Menu.actionMenu,menu);
- return base.OnCreateOptionsMenu(menu);
- }
toolbar中设置菜单项图标颜色、自定义菜单图标、设置菜单项文字颜色
- <style name="AppTheme.NoActionBar">
- <!--状态栏颜色-->
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <!--控制各个控件被选中时的颜色-->
- <item name="colorAccent">@color/colorAccent</item>
- <!--页面背景色-->
- <item name="android:windowBackground">@color/windowBackg</item>
- <!--底部导航栏颜色-->
- <item name="android:navigationBarColor">@color/navigationColor</item>
- <!--Appbar背景色-->
- <item name="android:colorPrimary">@color/colorPrimary</item>
- <!--ToolBar上的Title颜色-->
- <item name="android:textColorPrimary">@color/textColorPrimary</item>
- <!--各个控制控件的默认颜色-->
- <item name="android:colorControlNormal">@color/colorControlNormal</item>
- </style>
设置菜单项图标颜色:
通过上面的图和代码已经知道android:colorControlNormal设置各种控件的默认颜色,在Activity中Theme中这样写就可以了:
- <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
- <item name="colorControlNormal">@color/color_white</item>
- </style>
为什么要在Activity的主题里面设置?能不能直接Toolbar的主题设置,当然可以,直接通过设置Toolbar控件的android:theme=“****”就可以了。主题样式如下
- <style name="ActionMenuTheme" parent="Theme.AppCompat.Light.NoActionBar">
- <item name="colorControlNormal">@color/color_white</item>
- <!--改变菜单项文字颜色-->
- <item name="android:textColorPrimary">@color/color_red</item>
- <item name="android:textSize">12sp</item>
- </style>
toolbar 设置菜单项文字颜色
上面的toolbar的主题ActionMenuTheme 中的<item name="adnroid:textColorPrimary">@color/color_red</item>就是这事菜单项文字的颜色。效果如下:
toolbar 溢出菜单项图标的设置
如果你觉tollbar 的溢出菜单三个点不符合的审美感觉,你可以可以自定义一个图标来修改,同样我们设置toolbar的android:theme来做这件事情
- <style name="ActionMenuTheme" parent="Theme.AppCompat.Light.NoActionBar">
- <item name="colorControlNormal">@color/color_white</item>
- <!--改变菜单项文字颜色-->
- <item name="android:textColorPrimary">@color/color_red</item>
- <item name="android:textSize">12sp</item>
- <!--设置溢出菜单项图标-->
- <item name="actionOverflowButtonStyle">@style/ActionButton.Overflow.Custom</item>
- </style>
- <style name="ActionButton.Overflow.Custom" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
- <item name="android:src">@drawable/add_white</item>
- </style>
toolbar自定义溢出菜单样式
- <!--溢出菜单项下移-->
- <style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
- <!-- 是否覆盖锚点,默认为true,即盖住Toolbar -->
- <item name="overlapAnchor">false</item>
- <!-- 弹出层背景颜色 -->
- <item name="android:popupBackground">@color/color_primary</item>
- <!-- 弹出层垂直方向上的偏移,即在竖直方向上距离Toolbar的距离,值为负则会盖住Toolbar -->
- <item name="android:dropDownVerticalOffset">10dp</item>
- <!-- 弹出层水平方向上的偏移,即距离屏幕左边的距离,负值会导致右边出现空隙 -->
- <item name="android:dropDownHorizontalOffset">-10dp</item>
- </style>
然后再Activity中的Theme中添加以下style
- <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
- <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
- <item name="actionOverflowButtonStyle">@style/ActionButton.Overflow.Custom</item>
- <item name="android:textColorPrimary">@color/color_white</item>
- <item name="android:textSize">15sp</item>
- </style>
坑3:无法再Toolbar中设置app:popopTheme自定义溢出菜单样式
坑4:toolbar菜单项无法同时显示图标和文字
- <?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/menu_edit"
- android:icon="@drawable/edit"
- android:title="编辑"
- app:actionLayout="@layout/menu_action_edit"
- app:showAsAction="withText"/>
- <item android:id="@+id/menu_search"
- android:icon="@drawable/search"
- android:title="搜索"
- app:showAsAction="always|withText"/>
- <item android:id="@+id/menu_add"
- android:icon="@drawable/add_small"
- android:title="添加"
- app:showAsAction="always|withText"
- app:actionLayout="@layout/menu_action_add"
- />
- </menu>
- actionLayout指向的是一个布局文件,至于menu_action_add.axml。就是一个图标加文本使用drawableLeft属性。
- <?xml version="1.0" encoding="utf-8"?>
- <TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:paddingRight="10dip"
- android:gravity="center"
- android:text="添加"
- android:drawableLeft="@drawable/add_white"
- android:textColor="@color/color_white"
- android:clickable="true" />
效果图如下,google 默认在overflow中的actionMenu都只显示文字,要同时显示图标和文字,还需要想办法改变这一默认行为。
- public override bool OnMenuOpened(int featureId, IMenu menu)
- {
- System.Diagnostics.Debug.WriteLine(featureId);
- if ( menu != null)
- {
- var javaObj = (Java.Lang.Object)menu;
- var javaClass = javaObj.Class;
- if (javaClass.SimpleName.EndsWith("MenuBuilder"))
- {
- try {
- Java.Lang.Reflect.Method m = javaClass.GetDeclaredMethod("setOptionalIconsVisible", new Java.Lang.Class[] { Java.Lang.Boolean.Type });
- m.Accessible = true;
- m.Invoke(javaObj,new Java.Lang.Object[] { true});
- }
- catch (Java.Lang.NoSuchFieldException e)
- {
- System.Console.WriteLine("onMenuOpened:{0}",e.ToString());
- }
- }
- }
- return base.OnMenuOpened(featureId, menu);
- }
最终效果:
作者:张林
标题:xamarin android toolbar(踩坑完全入门详解) 原文地址:http://blog.csdn.net/kebi007/article/details/71247295
转载随意注明出处

[置顶] xamarin android toolbar(踩坑完全入门详解)的更多相关文章
- [置顶]
Xamarin android如何调用百度地图入门示例(一)
在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词"百度地图api",的确是泛泛而谈,我们来看一下百度地图的 ...
- [置顶]
Xamarin android沉浸式状态栏
虽然关于android "沉浸式"状态栏有很多博客介绍过,从小菜到大神无一例外.我第一次看到这种"沉浸"式的效果我也以为真的是这么叫,然而根本不是这么回事,完全 ...
- [置顶]
Xamarin Android安装教程(2016最新亲测安装版)
写这篇安装教程前要说的几句话 之前很多人想用Vs来开发Android项目,苦于这个环境的安装.的确这并不是一件简单的事情,并不是开发者都能在花一上午能装好,如果你花了一天时间,第一个Xamarin ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
- [置顶]
xamarin android自定义spinner
以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- [置顶]
xamarin android使用zxing扫描二维码
好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- [置顶]
xamarin android Fragment实现底部导航栏
前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...
随机推荐
- HBASE强制删除表
1,先把hdfs的对应表的数据删除 hadoop fs -mv /hbase/<table_name> /tmp 2,修复meta信息 hbase hbck -fixMeta -fixAs ...
- 印象笔记 MAC安装使用旧版本
印象笔记终于支持markdown了,赞! 第一个beta版用起来非常不错.提示更新安装新版本后保存markdown一直提示 "Note content is invalid.",无 ...
- PHP使用CURL抓取网页
CURL是一个非常强大的开源库,支持很多协议,包括HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS ...
- Linux_常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)
1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...
- 201771010126 王燕《面向对象程序设计(java)》第十八周学习总结
实验十八 总复习 实验时间 2018-12-30 1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设 ...
- Go语言基础之接口
Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口介绍 在Go语言中接口(interface)是一种类型,一种抽象的类 ...
- codeforces_A. Salem and Sticks_数组/暴力
A. Salem and Sticks time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 01.在vue中通过 JSONP 方式来跨域
//1.引入 : 在main.js 中引入该文件即可 //2.使用: axios.jsonp('地址').then(res => { // console.log(res) // } impor ...
- CentOS7设置SVN自启动,提交报错,无权限.手动kill掉后重启,成功.
参考文档:http://tieba.baidu.com/p/5174054662 最近想尝试在CentOS7上搭建SVN服务.遇到的问题大致如题,我这边再详细描述一下. 虚拟机:VMware® Wor ...
- 配置 RIPv1 和 RIPv2
拓扑图 场景您是公司的网络管理员.您所管理的小型网络中包含三台路由器,并规划了五个网络.您需要在网络中配置RIP路由协议来实现路由信息的相互传输.最初使用的是RIPv1,后来发现RIPv2更有优势,于 ...