Xamarin.Android MVP模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin.Android MVP模式相关的知识,希望对你有一定的参考价值。

一、简介

随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。

在MVP模式里通常包含4个要素:

    View:负责绘制UI元素、与用户进行交互(在android中体现为Activity);
    View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
    Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
    Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
所谓的MVP,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)

二、实例

1.新建一个项目,项目结构如下

技术分享

 

2.做一个根据id读取数据的实例,界面如下

技术分享

技术分享
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:id="@+id/id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入id"
        android:inputType="number" />
    <EditText
        android:id="@+id/first"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="inter first name"
        android:inputType="text" />
    <EditText
        android:id="@+id/last"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="inter last name"
        android:inputType="text" />
    <Button
        android:id="@+id/save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="save" />
    <Button
        android:id="@+id/load"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="load" />
</LinearLayout>
View Code

3.建立bean

 public class UserBean
    {
        private String mFirstName { get; set; }
        private String mLastName { get; set; }
          
        public UserBean(String firstName, String lastName)
        {
            this.mFirstName = firstName;
            this.mLastName = lastName;
        }
    }

4.建立model(处理业务逻辑),先写接口,后写实现

    public interface IUserModel
    {
        void SetID(int id);

        void SetFirstName(String firstName);

        void SetLastName(String lastName);

        int GetID();

        UserBean Load(int id);// 通过id读取user信息,返回一个UserBean
    }
 public class UserModel : IUserModel
    {
        public int GetID()
        {
            return 0;
        }

        public UserBean Load(int id)
        {
            // 查数据库或者联网获取id的userbean
            return new UserBean("11", "22");
        }

        public void SetFirstName(string firstName)
        {

        }

        public void SetID(int id)
        {

        }

        public void SetLastName(string lastName)
        {

        }
    }

 

5.建立view(更新ui中view状态),这里列出需要操作当前view的方法,也就是接口。

    public interface IUserView
    {
        int GetID();

        String GetFristName();

        String GetLastName();

        void SetFirstName(String firstName);

        void SetLastName(String lastName);
    }

6.建立presenter(主导器,通过ivew和imodel接口操作model和view),activity可以把所有逻辑给presenter处理

 

 public class UserPresenter
    {
        private IUserView mUserView;
        private IUserModel mUserModel;

        public UserPresenter(IUserView view)
        {
            mUserView = view;
            mUserModel = new UserModel();
        }

        public void SaveUser(int id, String firstName, String lastName)
        {
            mUserModel.SetID(id);
            mUserModel.SetFirstName(firstName);
            mUserModel.SetLastName(lastName);
        }

        public void LoadUser(int id)
        {
            UserBean user = mUserModel.Load(id);
            mUserView.SetFirstName(user.mFirstName); // 通过调用IUserView的方法来更新显示
            mUserView.SetLastName(user.mLastName);
        }
    }

7.activity中实现iview接口,在其中操作view,实例化一个presenter变量。

 public class MainActivity : Activity, IUserView, View.IOnClickListener
    {
        UserPresenter presenter;
        EditText id, first, last;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
             FindViewById<Button>(Resource.Id.save).SetOnClickListener(this);
             FindViewById<Button>(Resource.Id.load).SetOnClickListener(this); ;
            
            id = FindViewById<EditText>(Resource.Id.id);
            first = FindViewById<EditText>(Resource.Id.first);
            last = FindViewById<EditText>(Resource.Id.last);
            presenter = new UserPresenter(this);
        }

        public int GetID()
        {
            return Convert.ToInt32(id.Text.ToString());
        }

        public string GetFristName()
        {
            return first.Text.ToString();
        }

        public string GetLastName()
        {
            return last.Text.ToString();
        }

        public void SetFirstName(string firstName)
        {
            first.Text = firstName;
        }

        public void SetLastName(string lastName)
        {
            last.Text = lastName;
        }

        public void OnClick(View v)
        {
            switch (v.Id)
            {
                case Resource.Id.save:
                    presenter.SaveUser(GetID(), GetFristName(), GetLastName());
                    break;
                case Resource.Id.load:
                    presenter.LoadUser(GetID());
                    break;
            }
        }
    }

7.源码地址

 https://github.com/huguodong/XamarinMVP 

里面又更详细的实例

以上是关于Xamarin.Android MVP模式的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Android 片段库

片段中的 Xamarin Android Google 地图错误

如何在运行时用 ChildFragmentManager 和没有 PagerSlidingTabStrip Xamarin.Android 标题的片段替换片段

Xamarin.Android WebView App性能问题

在 xamarin.android 中管理屏幕旋转时的片段外观

二进制 XML 文件第 1 行:Xamarin Android 中 Google Maps 的类片段错误膨胀错误