最近,升级 Xamarin.Forms 到最新版本后,发现Droid 项目下引入了以下几个依赖包:

Xamarin.Android.Support.Design
Xamarin.Android.Support.v7.AppCompat
Xamarin.Android.Support.v7.CardView
Xamarin.Android.Support.v7.MediaRouter

Material Design 是 Android 棒棒糖 带来的东西, 之前 Xamarin.Form 不支持它。

这几个依赖包,就是告诉我们:Xamarin.Form 也支持 Material Design 了!

但是编译,直接报错,错误主要集中在 Resource.Designer.cs 上,有几百个未定义!

开始以为不是最新的 Android SDK 引起的问题,可是安装 API Level 23 的 SDK 后, 问题依然。

翻来翻去,翻了两天,一直是这个问题,没有合适的答案.

今天找了一篇官方博客:

https://blog.xamarin.com/material-design-for-your-xamarin-forms-android-apps/

认真的对比了一下,除了这几个DLL的版本不一样外,其它都是照抄的,可是依然不行,甚至还提示:

Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.NoActionBar'.

试了试手动将以上几个DLL 降级到 23.0.1.3 (最新版本是 23.1.0 beta 版),Xamarin.Forms 降级到 1.5.1.6471 (最新版本是 1.5.2.6477-pre2)

重新编译神一般的通过了,看来 pre 版,beta 版最好是不要试,出了问题都不知道哪里的。。。

看一下效果:Android 5.1

Android 4.2

几乎一样,虽然 Material 是5.0的东西,但是在 4.2 上也有一样的效果。这应归功于 Android.Support.v7.AppCompat, 具体不了解,请 Android 大侠勿喷。

与之前的非 Material 支持对比,这里最大的变化之处就是支持左右滑动切换页面了,之前必须是点击标签头,才能切换。那时我还费尽心思的想自己弄个自定义 Renderer 呢,现在不用了。

------------------------------------

好啦,上面是费话, 进入正题: Xamarin.Forms 如何 Material

1, 更新相关 DLL

2, Resources/values/styles.xml

 <resources>
   <style name="MyTheme" parent="MyTheme.Base">
   </style>
   <style name="MyTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="colorPrimary">@color/primary</item>
     <item name="colorPrimaryDark">@color/primaryDark</item>
     <item name="colorAccent">@color/accent</item>
     <item name="android:windowBackground">@color/window_background</item>
   </style>
 </resources>

2, Resources/values-v21/styles.xml

 <resources>
   <style name="MyTheme" parent="MyTheme.Base">
     <item name="android:windowDrawsSystemBarBackgrounds">true</item>
     <item name="android:statusBarColor">@android:color/transparent</item>
   </style>
 </resources>

3, Resources/values/colors.xml

 <resources>
   <color name="primary">#2196F3</color>
   <color name="primaryDark">#1976D2</color>
   <color name="accent">#FFC107</color>
   <color name="window_background">#F5F5F5</color>
 </resources>

4, Resources/layout/toolbar.xml

 <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"
     android:minHeight="?attr/actionBarSize"
     android:background="?attr/colorPrimary"
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
     app:layout_scrollFlags="scroll|enterAlways" />

5,Resources/layout/tabs.xml

 <android.support.design.widget.TabLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/sliding_tabs"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="?attr/colorPrimary"
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
     app:tabIndicatorColor="@android:color/white"
     app:tabGravity="fill"
     app:tabMode="fixed" />

6, MainActivity.cs

     [Activity(Label = "蓝色理想", Theme = "@style/MyTheme", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
     public class MainActivity : FormsAppCompatActivity {
         protected override void OnCreate(Bundle bundle) {
             base.OnCreate(bundle);

             global::Xamarin.Forms.Forms.Init(this, bundle);

 8             FormsAppCompatActivity.ToolbarResource = Resource.Layout.toolbar;
 9             FormsAppCompatActivity.TabLayoutResource = Resource.Layout.tabs;

             LoadApplication(new App(IoC.Get<SimpleContainer>()));
         }
     }

Theme="@style/MyTheme" 即 styles.xml 中扩展出来的 style

FormsAppCompatActivity 代替原来的 FormsApplicationActivity

具体请参考:

https://github.com/gruan01/Discuz.Mobi/tree/master/Discuz/Discuz.Droid

有一个小问题: 页签(tabs)文字超长时,会换行, 不用 Material 的时候, 超过部份可以滑动, 而现在是换行, 不可滑动.

-----------------

OK, 完,

Material Design For Xamarin.Forms的更多相关文章

  1. Xamarin.Forms 开发资源集合(复制)

    复制:https://www.cnblogs.com/mschen/p/10199997.html 收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 S ...

  2. Xamarin.Forms 开发资源集合

    收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 Snppts: Xamarin Forms UI Snippets. Prebuilt Templat ...

  3. xamarin forms中的Button文本默认大写

    问题来源 使用xamarin forms创建的android项目中,Button.Toolbar的右侧菜单按钮上的如果是字母的话,在android5.0以上,默认的文本都是大写,这种情况iOS项目不存 ...

  4. Xamarin.Forms 入门

    介绍 Xamarin.Forms是一个开源UI框架,Xamarin.Forms允许开发人员从单个共享代码库构建Android,iOS和Windows应用程序. Xamarin.Forms允许开发人员使 ...

  5. xamarin.forms新建项目android编译错误

    vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...

  6. 仿知乎app登录界面(Material Design设计框架拿来就用的TexnInputLayout)

    在我脑子里还没有Material Design这种概念,就我个人而言,PC端应用扁平化设计必须成为首选,手当其冲的两款即时通讯旺旺和QQ早就完成UI扁平化的更新,然而客户端扁平化的设计本身就存在天生的 ...

  7. Creating Reusable XAML User Controls with Xamarin Forms

    In the previous post on making fancy layouts with Xamarin Forms we saw how you can design a Dashboar ...

  8. 菜鸟的Xamarin.Forms前行之路——从新建项目到APP上架各种报错问题解决方法合集(不定时更新)

    出自:博客园-半路独行 原文地址:http://www.cnblogs.com/banluduxing/p/7425791.html 本文出自于http://www.cnblogs.com/banlu ...

  9. Xamarin Forms:小马过河,王者归来

    因为我媳妇的原因,去年下半年从零开始学习Android原生开发,做了一个答题库app.整体给我的感觉是入门难度不大,前期折腾一番,大部分时间都是花在开发上面,其实任何一门语言都是如此. 今年我又有另一 ...

随机推荐

  1. 关于Math类的round、floor、ceil三个方法

    一.Math类这三个方法的简介 1.round():取最接近的值. 对于这个方法,查看源代码,其实现如下: public static long round(double a) { if (a != ...

  2. oracle表空间相关

    数据库被划分为若干个表空间,每个表空间内保存一组相关的逻辑对象.每个表空间由一个或者多个数据文件组成.oracle中的数据逻辑上存储在表空间里,物理上存储在属于该表空间的数据文件里.表空间是用户和物理 ...

  3. PHP验证码

    设计一个验证码类,在需要的时候可以随时调用 验证码类,保存为ValidateCode.class.php <?php //验证码类 session_start(); class Validate ...

  4. D_S 线性表的顺序表示和实现

    线性表的顺序表示又称为顺序存储结构或顺序映像 顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构,简言之,逻辑上相邻,物理上也相邻 顺序存储方法:用一组地址连续的存储单元依次存 ...

  5. 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

  6. 合工大OJ 1330 种树

    Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2, ...

  7. 页面分享代码share

    在开发一个页面的时候常常会有这么一个小功能,就是分享该页面中的信息. 常见的分享代码有百度分享,JiaThis分享插件,bshare分享插件等,我主要分享一下自定义分享代码,如下: function ...

  8. ZOJ 3157 Weapon --计算几何+树状数组

    题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...

  9. Linux+Mono+Asp.net入门:05CentOs安装Mono(上)

    http://www.cnblogs.com/jameszou/archive/2013/05/18/3085754.html 准备工作 常见问题 a. Xshell显示中文乱码问题 [文件]–> ...

  10. Jenkins学习八:Jenkins语言本地化

    在Jenkins中,英语一大片,不懂英语的看着头疼.非常高兴的是,Jenkins作为一个主流流行的持续构建工具,提供了一个本地化语言的配置界面. 你可以找到它,在Jenkins每页的左下角.如下图: ...