xamarin android toolbar(踩坑完全入门详解)
网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费。如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到这篇文章,说明还是搜了xamarin android toolbar。那么这篇文章就好好总结一下toolbar在xamarin android中如何使用,减少大家踩坑的时间。
了解Toolbar
xamarin android中使用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
转载随意注明出处
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android开发技巧——实现设计师给出的视觉居中的布局
本篇主要是对自定义控件的测量方法(onMeasure(int widthMeasureSpec, int heightMeasureSpec))在实际场景中的运用。 在移动应用的设计中,经常有这样的界面:某个界面的元素非常少,比如空列表界面,或者某某操作成功的界面,只有一两个元素在中间。但是它们在某个布局里又不是数学上的那个居中,而是经过设计师调出来的“视觉居中”。这种“视觉居中”内部是怎么计算的,我大致也不懂,反正结果就是设计师们看起来要显示的信息给人有感觉是在中间的(通常是比中间偏上一点)。 既是这样,那我们在布局中就不能用gravity="center"或layout_gravity="center"等这样的属性来设置了。而使用固定的padding或margin来调整它的位置,也难以在不同的屏幕分辨率中实现同样的效果,那就只好按钮设计图的标注,按比例来计算它的位置了。 按比例来调整子view与layout中的距离,在约束布局(ConstraintLayout)中是可以做到的,但是在我个人看来相对这样简单的需求,约束布局有点重了,并且它的依赖在不同方式的编译下总是很容易出问题(比如...
- 下一篇
IOS WebView控件详解
概述 WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用,WKWebView是在iOS8开始使用,WKWebView将逐步取代笨重的UIWebView。 相比UIWebView,WKWebView做了如下优化: WKWebView更多的支持HTML5的特性 WKWebView更快,占用内存可能只有UIWebView的1/3 ~ 1/4 WKWebView高达60fps的滚动刷新率和丰富的内置手势 WKWebView具有Safari相同的JavaScript引擎 WKWebView增加了加载进度属性 UIWebView UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化。其加载数据的方式有三种: 第一种: - (void)loadRequest:(NSURLRequest *)request; 这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的。例如: - (void)simpl...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路