网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费。如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到这篇文章,说明还是搜了xamarin android toolbar。那么这篇文章就好好总结一下toolbar在xamarin android中如何使用,减少大家踩坑的时间。

了解Toolbar

android3.0推了ActionBar这个控件,android5.0开始推出Materal Design,其中就有ToolBar控件。可能官方觉得ActionBar限制app开发设计的弹性,google非常推荐大家使用ToolBar来作为客户端的导航栏,以此来取代ActionBar。
ToolBar使用更灵活,设计更多样性。主要的优点有1.可以设置导航栏图标、Logo、标题和子标题等属性; 2可添加自定义控件;3.支持Action Menu;4.可随意设置位置

xamarin android中使用Toolbar

官方为了将toolbar这一控件向下兼容,推出了兼容版的toolbar,所以首先的引入Android.Support.V7.AppCompat。我们先来看看最终完成的整体的效果图

写第一个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:*** 找不到的属性,应该使用Toolbar这个控件自带的属性。所以我在根布局加了
xmlns:app="http://schemas.android.com/apk/rs-auto" 使用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 菜单项

toolbar可以添加菜单项,在Resources文件下建一个menu文件夹专门放菜单。先来看一下actionMenu.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">
<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);
}
}
}
关于showAsAction 展现在Action条目中的几个属性值有这几个:
  1. always:使菜单项一直显示在ToolBar上。
  2. ifRoom:如果有足够的空间,这个值会使菜单项显示在ToolBar上。
  3. never:使菜单项永远都不出现在ToolBar上,在…的子项中显示。
  4. withText:使菜单项和它的图标,菜单文本一起显示。

坑2:toolbar中使用setSupportActionBar方法菜单项不见了

如果在onCreate方法里面使用兼容包的方法SetSupportActionBar(toolbar) 后发现菜单项不显示了,这就有点尴尬了,所以要在OnCreateOptionsMenu方法中加上一句代码加载菜单项才能显示
        public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.actionMenu,menu);
return base.OnCreateOptionsMenu(menu);
}

toolbar中设置菜单项图标颜色、自定义菜单图标、设置菜单项文字颜色

对于设置各种颜色,我们先来看看这张图,我是盗图的......,然后结合style文件看看如何设置这些颜色。原文地址http://blog.csdn.net/u012702547/article/details/50932090
  <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自定义溢出菜单样式

虽然上面我们进行了图标颜色,自定义图标,菜单文字颜色的修改,但是这和我们一般的app上的ToolBar还是有一定差距,菜单项挡住了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自定义溢出菜单样式

看了android的做法这个溢出菜单下移OverflowMenuStyle样式可以写在Toolbar 的属性app:popupTheme但是没有效果,如果知道怎么解决,欢迎评论指出。

坑4:toolbar菜单项无法同时显示图标和文字

根据图上所看到的,显示toolbar上的菜单项是图标,但是显示popupMenu上的只有文字没有图标,我们想要修改一下让图标和文字同时显示在popupMenu上该怎么做呢。使用withText也并有作用,这时要使用app:actionLayout属性了。在menu文件夹的菜单布局下加上app:actionLayout属性
<?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都只显示文字,要同时显示图标和文字,还需要想办法改变这一默认行为。

overflow中的ActionMenu显不显示图标,是有MenuBuilder这个类的setOptionalIconsVisable方法决定的,在菜单展开的时候给这个方法传入true,那每个菜单项的图标和文字都会显示出来,尴尬的是要java的反射方法去做这件事,重写OnMenuOpend方法
        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);
}

最终效果:

最后总结一句:纸上得来终觉浅,绝知此事要躬行。关于toolbar的更多属性还要仔细去琢磨。
代码下载地址http://download.csdn.net/detail/kebi007/9835823

作者:张林

标题:xamarin android toolbar(踩坑完全入门详解) 原文地址:http://blog.csdn.net/kebi007/article/details/71247295

转载随意注明出处

有兴趣的可以关注一下我的微信公众号[dotNet全栈开发],分享一些编程相关的经典文章

[置顶] xamarin android toolbar(踩坑完全入门详解)的更多相关文章

  1. [置顶] Xamarin android如何调用百度地图入门示例(一)

    在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词"百度地图api",的确是泛泛而谈,我们来看一下百度地图的 ...

  2. [置顶] Xamarin android沉浸式状态栏

    虽然关于android "沉浸式"状态栏有很多博客介绍过,从小菜到大神无一例外.我第一次看到这种"沉浸"式的效果我也以为真的是这么叫,然而根本不是这么回事,完全 ...

  3. [置顶] Xamarin Android安装教程(2016最新亲测安装版)

    写这篇安装教程前要说的几句话 之前很多人想用Vs来开发Android项目,苦于这个环境的安装.的确这并不是一件简单的事情,并不是开发者都能在花一上午能装好,如果你花了一天时间,第一个Xamarin   ...

  4. [置顶] xamarin android自定义标题栏(自定义属性、回调事件)

    自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...

  5. [置顶] xamarin android自定义spinner

    以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...

  6. [置顶] xamarin android使用gps定位获取经纬度

    看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...

  7. [置顶] xamarin android使用zxing扫描二维码

    好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...

  8. [置顶] xamarin android 布局尺寸了解

    为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接  ...

  9. [置顶] xamarin android Fragment实现底部导航栏

    前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment  Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...

随机推荐

  1. 20162329张旭升 2018-2019-2《网络对抗技术》第1周 Kali的安装

    目录 Kali的安装 设置与主机的文件交互 Kali的安装 1.创建虚拟机 2.选择安装语言 3.设置网络 4.设置分区 5.安装完成 设置与主机的文件交互 首先在vmware workstation ...

  2. MyBatis3系列__05查询补充&resultMap与resultType区别

    1.查询补充 当你查询一条记录并且是简单查询时,情况相对简单,可以参考以下的例子: public Employee getEmpById(Integer id); 对应的xml文件中: <sel ...

  3. Zathura: 轻巧好用的 PDF 查看器]

    [Zathura: 轻巧好用的 PDF 查看器](https://linuxtoy.org/archives/zathura.html) 这个文件很轻巧,且支持VIM方式的 快捷键

  4. Hibernate 检索方式之 HQL 检索方式

    HQL(Hibernate Query Language) 是面向对象的查询语言,它和 SQL 查询语言有些相似.在 Hibernate 提供的各种检索方式中,HQL 是使用最广的一种检索方式,它有如 ...

  5. Flume+Kafka+Storm整合

    Flume+Kafka+Storm整合 1. 需求: 有一个客户端Client可以产生日志信息,我们需要通过Flume获取日志信息,再把该日志信息放入到Kafka的一个Topic:flume-to-k ...

  6. Prometheus 自定义exporter 监控key

    当Prometheus的node_exporter中没有我们需要的一些监控项时,就可以如zabbix一样定制一些key,让其支持我们所需要的监控项. 例如,我要根据 逻辑cpu核数 来确定load的告 ...

  7. 解决java.lang.IllegalArgumentException: No converter found for return value of type

    1原因:这是因为springmvc默认是没有对象转换成json的转换器的,需要添加jackson依赖. 简而言之   需要将对象转化为json对象   Jackson 是一种实现方式 <depe ...

  8. yum出现Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile解决方法

    yum出现Could not retrieve mirrorlist解决方法 Loaded plugins: fastestmirror, securityLoading mirror speeds ...

  9. 28 ArcMap 运行特别慢怎么办

    小编电脑配置如下: , 虽然不是太好吧,但还是满足ArcMap运行的要求的,但不知道为什么,就是很慢,终于在无意中,发现了一个位置,取消勾选以后,ArcMap变的快很多,亲测有效 取消后台处理后,Ar ...

  10. XML语言1.简介和语法

    一.什么是XML语言? XML 指可扩展标记语言(Extensible Markup Language) Xml是独立于软件和硬件的信息传输工具. XML 是一种很像HTML的标记语言. 但xml不是 ...