Xamarin.Forms学习之Platform-specific API和文件操作

  这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十章和需要相关知识的第九章,这篇文章中的内容则是我学习这两章的一点记录和分享,还是那样,有错请留言指正,谢谢!

  不同的平台存在着一些特定的API,通过在电子书中两章的学习,实践一下如何调用这些API和将这些API封装成公共的库,供以后的项目调用。以一个显示平台信息的小实例开始做一个简单的演示,其运行效果如下:

  

  C#代码如下(就是电子书中的实例,只不过只有IOS和Android的):

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App3.Views.DisplayModelAndVersion">
  <StackLayout Padding="20">
        <StackLayout VerticalOptions="CenterAndExpand">
            <Label Text="Device Model:" />

            <ContentView Padding="10, 0, 0, 0">
                <Label x:Name="modelLabel"
                       FontSize="Large"
                       FontAttributes="Bold" />
            </ContentView>
        </StackLayout>

        <StackLayout VerticalOptions="CenterAndExpand">
            <Label Text="Operating System Version:" />

            <ContentView Padding="10, 0, 0, 0">
                <Label x:Name="versionLabel"
                       FontSize="Large"
                       FontAttributes="Bold" />
            </ContentView>
        </StackLayout>
    </StackLayout>
</ContentPage>

#if __IOS__
using UIKit;

#elif __ANDROID__
using Android.OS;
#endif

namespace App3.Views{
    public partial class DisplayModelAndVersion: ContentPage
    {
        public PlatInfoSap1Page ()
        {
            InitializeComponent ();

#if __IOS__

            UIDevice device = new UIDevice();
            modelLabel.Text = device.Model.ToString();
            versionLabel.Text = String.Format("{0} {1}", device.SystemName,
                                                         device.SystemVersion);

#elif __ANDROID__

            modelLabel.Text = String.Format("{0} {1}", Build.Manufacturer,
                                                       Build.Model);
            versionLabel.Text = Build.VERSION.Release.ToString();

#endif

        }
    }
}

  记得在程序集中添加对Mono.Android和Xamarin.IOS的引用。

  也许只有这一个,你看不出很麻烦,但是如果你要调用更多的特定的API,那么可以想见,你的代码中将会有许多的“#if __IOS__ xxxxx  #elif __ANDROID__ xxxxxx #endif”这样的代码,那能不能把这些特定的API封装在其相应的平台,实现分平台的调用呢,当然是可以的。。。。。。我就不写其他的废话,就是通过DependencyService来实现的,直接上代码:

  

  添加如上图所的接口和类(Sorry,下面那个箭头搞错了)

    public interface IPlatformInfo
    {
        string GetModel();

        string GetVersion();
    }

    public class PlatformInfo
    {
        IPlatformInfo fileHelper = DependencyService.Get<IPlatformInfo>();

        public string GetModel()
        {
            return fileHelper.GetModel();
        }

        public string GetVersion()
        {
            return fileHelper.GetVersion();
        }
    }

[assembly: Dependency(typeof(App3.Droid.PlatformInfo))]
namespace App3.Droid
{
    class PlatformInfo : IPlatformInfo
    {
        public string GetModel()
        {
            return string.Format("{0} {1}", Build.Manufacturer, Build.Model);
        }

        public string GetVersion()
        {
            return Build.VERSION.Release;
        }
    }
}

  记住DependencyService和Dependency的命名空间是Xamarin.Froms,我开始没注意就被坑了。IOS的代码没有什么变化,就是命名空间变了,就不贴出来了,我也没写。。。

  当你看到“assembly: Dependency”这个的时候,你也许就联想到了反射--是的,就是通过反射。建议大家在实现相关的功能是首先使用DependencyService,至于原因我就不用我蹩脚的英语给大家翻译了,直接上原文:

DependencyService is not the only way to implement platform-specific calls in a PCL. Adventurous developers might want to use dependency-injection techniques to configure the PCL to make calls into the platform projects. But DependencyService is very easy to use, and it eliminates most reasons to use a Shared Asset Project in a Xamarin.Forms application.

  

  现在我们继续说说如何把这些设置成公共的库,便于以后的项目调用,其实很简单,就像我们新建一个Xamarin.Froms项目一样,新建一个Xamarin.Platfrom.Tools项目,然后把上面PlatformInfo相关的类和接口再写一遍,建议再添加一个Init的cs文件,代码中不用实现什么具体的东西,其功能就是确保dll正确的加载了。

  对于文件的操作,电子书中有个小标题“Good news and bad news”,当中的主要内容就是告诉大家操作文件的是System.IO命名空间(该命名空间下还有个FileInfo类)下的File类在Android和IOS是可以共用的,但是在Windows的三个平台不行,最明显的一个区别就是Windows的三个平台的文件操作是异步的,做过WP开发的应该知道。鉴于目前的移动端的情形,和使用Xamarin开发的主要需求,那个”bad news“我们基本可以忽略了(开发Windows的还是用UWP吧)。

  在移动端,基本上都包含一些基本的文件夹,比如Pictures、Music等这些都是公共的,而APP所访问的文件夹和文件还有一个限制,在WP开发中有个名词叫“隔离存储”或者“独立存储”,IOS和Android我并没有太多的接触,但这方面应该都是大体相同的,所以每个应用程序都除了能访问前面说的公共的文件夹和文件之外,都只能访问自己的程序“域”下面的文件夹和文件,做过移动开发或者了解移动开发的应该都知道。对于这些文件夹,Xamarin定义一个SpecialFolder的枚举,其中的MyDocuments就是我们自己的APP才能访问的。通过下面的示例继续:

  

  添加如上图所示的红色箭头的类和接口,代码如下(限于文章的篇幅,我就不贴整个代码,只上GetFiles的):  

namespace App3.TestFile
{
    public interface IFileHelper
    {        IEnumerable<string> GetFiles();    }
}

namespace App3.TestFile
{
    public class FileHelper
    {
        IFileHelper fileHelper = DependencyService.Get<IFileHelper>();

        public IEnumerable<string> GetFiles()
        {
            return fileHelper.GetFiles();
        }    }
}

[assembly: Dependency(typeof(App3.Droid.FileHelper))]
namespace App3.Droid
{
    class FileHelper : IFileHelper
    {

public IEnumerable<string> GetFiles()
        {

       // Sort the filenames.
            //string path = GetDocsFolder();
            //IEnumerable<string> filenames =
            //    from filepath in new List<string> { path }
            //    select filepath;

IEnumerable<string> filenames =
                from filepath in Directory.EnumerateFiles(GetDocsFolder())
                select filepath;

return filenames;
        }

string GetDocsFolder()
        {
            return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        }
    }
}

 

  至于XAML呢么就是一个简单的ListView,这个倒没什么说的。大家自己试一试吧。

  这里的文件操作能满足我们许多的需求了,但是有时候我们在项目中添加一个图片、文件或者其他的,该怎么办呢。。。下次再说操作本地文件的事吧!

  其实最开始的那版文字描述更通顺一些,结果出去吃了饭,回来发现没有自动保存,而且以前写的忘了,然后又重新写了,现在自己读了一次。。。

  对了,.net core发布了,最近也在摸索,相比于Xamarin,分享和关注的人也更多,学习起来还是很方便的,上周自己也买了一个最便宜的阿里云的在玩,无语啊,linux也成必学的了,伤心~共勉!

时间: 2024-10-12 09:04:20

Xamarin.Forms学习之Platform-specific API和文件操作的相关文章

Xamarin.Forms学习之位图(二)

上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamarin还没有支持到这个版本(我也不想用Xamarin来发UWP项目).还有就是园友问怎么知道哪些是平台特殊的API(Platform-specific API和文件操作),自认为呢,当你调用一个API的时候需要引用Xanmarin.IOS和Mono.Android或者说除了.NET的API都算是Pla

Web API与文件操作

前段时间,一直有练习ASP.NET MVC与Web API交互,接下来,Insus.NET再做一些相关的练习,Web API与文件操作,如POST文件至Web API,更新或是删除等. 不管怎样,先在数据库创建一张表,用来存储上传的文件.本实例中是把文件存储过数据库的. CREATE TABLE ApiFileDemo ( [Afd_nbr] INT IDENTITY(1,1) PRIMARY KEY NOT NULL, [Picture] [image] NULL, [PictureType]

Xamarin.Forms学习之Page Navigation(一)

在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟着pdf写上面的monkey实例,然而我却遇到了一个问题,我在列表页点击某一个Item的时候,不能如示例上面所展示的那样跳转到详细页面.也正因为此我在官方文档和电子书中寻找答案,也将自己的学习的东西做个简单的笔记和分享. 在Froms的中的提供了如下方法用于导航: Task PushAsync(Pa

Xamarin.Forms学习之初

微软的Build 2016结束的有段时间了,对于一个简单的小屌丝程序员--我来说,关注最大的无疑是Xamarin的免费(开源什么的让大神们上吧),内心激动啊.大会结束的周末我就迫不及待的安装了,然后...一脸的懵逼,更新vs后什么sdk,jdk都不知道,唯一知道的就是没法运行,后来大神们相继出了一些文章,才开始了解一些大概,有错误的请在下面留言提出,免得我误导了别人. xamarin可以简单分为一下几个: Xamarin.Forms:个人觉得这才是Xamarin真正的优势所在,真正的跨平台,一次

【API】文件操作编程-CreateFile、WriteFile、SetFilePointer

1.说明 很多黑客工具的实现是通过对文件进行读写操作的,而文件读写操作实质也是对API函数的调用. 2.相关函数 CreateFile : 创建或打开文件或I/O设备.最常用的I/O设备如下:文件,文件流,目录,物理磁盘卷,控制台缓冲,磁带驱动器,通信资源,邮槽,和管.函数返回一个句柄,可以根据文件或设备和指定的标志和属性来访问各种类型的I/O文件或设备. HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesire

Xamarin.Forms学习之Page Navigation(二)

在上一篇的文章中,对页面常规的导航做一些分享,然而在实际的编程中,页面数据的保持,传值等等都有很多,这篇文章就对这些相关内容做一个分享和记录,有问题,希望大家留言指正.这一篇从实现业务逻辑来讲并没有什么特别的,这里主要是说说通过Properties和生命周期实现数据的“保持”.当然这里遇到了一个让我懵逼的问题,电子书中介绍说,Properties的值是会一直保持的,直到App卸载,但是在我的安卓机中实验,程序终止后,值就为空了,不知是我看掉了什么东西还是怎么了,不知道大家有没有遇到这个问题,希望

Xamarin.Forms学习之位图(一)

在开始我的分享之前呢,让我先问下我的问题: 1.最近更新了Xamarin 4.1.1.3,我想问下版本更新信息在哪里看? 2.更新后我新建的项目没有UWP项目了(虽然没有用过,但是我想确认是4.1.1.3移除了还是我自身的问题),其实我觉得移除了也好,UWP就用UWP写最好了! 3.我的模拟器无法使用,是我安装的问题还是说有其他的设置? 再吐个槽: 1.Xamarin.Froms早已经更新到了2.3了,但是vs的模板一直没更新(还是说可以其他设置更新?还是说2.3不稳定?),导致新建的项目的Fr

arm-linux学习笔记3-linux内存管理与文件操作

配置好linux系统之后需要vim配置一下,有助于我们的编程,主要的配置如下 在/etc/vim/vimrc文件中 "显示行号 set number "自动缩进 set autoindent "智能缩进 set smartindent "一次四格 tab set tabstop=4 "一次四格 set shiftwidth=4 "括号匹配 set showmatch "右下角显示光标状态行 set ruler "文件类型检测

学习Linux笔记(四)--文件操作

学会cd命令: 绝对路径,相对路径(./或者../): 文件列表: ls -F(正斜杠表示目录)  -a(显示隐身)  -l(详细信息) -R(显示目录文件) -i(显示索引号) 过滤列表输出:ls -l test(这是关键词,可使用?或者通配符) 文件处理: touch创建一个空文件,-t指定时间戳: cp复制文件,-r递归复制文件,-R递归目录,-p保持复制时间于源文件一致: mv移动或重命名文件,rm删除文件,-r递归删除. mkdir目录创建,rmdir删除空目录. stat:查看文件统