Android中的设计思想一

摘要:
Android设计思想直接上示例↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓xml布局/***MVC模式登陆案例*/classMVCActivity:AppCompatActivity(){privatelateinitvaruserName:EditTextprivatelateinitvarlogIn:Buttonprivatevarmodel:MVCModel=MVCModel()overridefunonCreate(savedInstanceState:Bundle?){super.onCreatesetContentView}/***当登陆按钮被点击*/funonLogClick{userName.setTextToast.makeText.show()}overridefunonContentChanged(){super.onContentChanged()userName=findViewByIdlogIn=findViewById}}classMVCModel{fungetData:String{returndata+"asd"}}MVCModel作为MVC中的model部分数据的处理与获取都在Model中进行。Activity作为Controller作为Model与View的交互节点。view上的点击事件的处理在Controller中具体实现。controller拿到数据以后将数据交给Model,Model处理完数据以后返回处理完的数据给Controller即MVCActivity,然后Controller将数据显示在View上即使用Toast显示。/***MVC模式登陆案例*/classMVCActivity:AppCompatActivity(){privatelateinitvarmView:LogViewprivatevarmodel:MVCModel=MVCModel()overridefunonCreate(savedInstanceState:Bundle?

Android设计思想

直接上示例 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

xml布局

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="20dp"
    tools:context=".mvc.MVCActivity">

    <EditText
        android: 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:background="@color/purple_200" />

    <Button
        android: 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/black"
        android:onClick="onLogClick"
        android:text="登录" />
</LinearLayout>
/**
 * MVC模式登陆案例
 */
class MVCActivity : AppCompatActivity() {
    private lateinit var userName: EditText
    private lateinit var logIn: Button
    private var model: MVCModel = MVCModel()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main4)
    }

    /**
     * 当登陆按钮被点击
     */
    fun onLogClick(v: View) {
        userName.setText(model.getData(userName.text.toString()))
        Toast.makeText(this, userName.text.toString(), Toast.LENGTH_SHORT).show()
    }

    override fun onContentChanged() {
        super.onContentChanged()
        userName = findViewById(R.id.et_userName)
        logIn = findViewById(R.id.log)
    }
}

class MVCModel {
    fun getData(data: String): String {
        return data + "asd"
    }
}

MVCModel作为MVC中的model部分数据的处理与获取都在Model中进行。
Activity作为Controller作为Model与View的交互节点。view上的点击事件的处理在Controller中具体实现。表现为View ->controller。controller拿到数据以后将数据交给Model,Model处理完数据以后返回处理完的数据给Controller即MVCActivity,然后Controller将数据显示在View上即使用Toast显示。
MVC:当界面复杂的时候,Controller中的代码会比较多,可能要控制和改变各种view的显示和状态.常见的优化操作是将View抽离,比如下面代码。

/**
 * MVC模式登陆案例
 */
class MVCActivity : AppCompatActivity() {
    private lateinit var mView: LogView
    private var model: MVCModel = MVCModel()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.mvc_new)
    }
}

class MVCModel {
    fun getData(data: String): String {
        return data + "asd"
    }
}

class LogView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : LinearLayout(context, attrs, defStyleAttr) {
    private val model: MVCModel = MVCModel()
    private var userName: EditText
    private var logIn: Button
    private val mView: View = LayoutInflater.from(context).inflate(R.layout.log_view, this, false)

    init {
        userName = mView.findViewById(R.id.et_userName)
        logIn = mView.findViewById(R.id.log)
        addView(mView)
        logIn.setOnClickListener {
            val data = model.getData(userName.text.toString())
            Toast.makeText(context, data, Toast.LENGTH_SHORT).show()
        }
    }

}

我们再来看一下MVP上的设计思想 看下面代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

class Presenter(view: IView) {
    // model层引用
    private val dataSource: IData = Model()

    // view层引用
    private val mView: IView = view

    public fun processData(data: String) {
        val processData = dataSource.processData(data)
        mView.showRes(processData)
    }

    interface IView {
        // activity实现用于将处理完数据更新到view上
        fun showRes(processData: String)
    }

    interface IData {
        fun processData(data: String): String
    }
}
// 一般model层将加工的数据通过callback的形式回调给presenter层,为了简单少写了接口
class Model : Presenter.IData {
    override fun processData(data: String): String {
        return data + "asd"
    }
}

class MVPActivity : AppCompatActivity(), Presenter.IView {
    private lateinit var et: EditText
    // presenter层引用
    private val presenter: Presenter = Presenter(this)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main4)
        et = findViewById(R.id.et_userName)
        findViewById<View>(R.id.log).setOnClickListener {
            presenter.processData(et.text.toString())
        }
    }

    // presenter层数据回调
    override fun showRes(processData: String) {
        Toast.makeText(this, processData, Toast.LENGTH_SHORT).show()
    }
}

MVP将Activity中的部分代码给抽离出来部分,并且MVP中大量使用的面向接口编程也是为了降低各层次间的耦合,presenter作为view与model间数据互换的桥梁。

免责声明:文章转载自《Android中的设计思想一》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nuxt.js端口冲突 Nuxt.js 如何更改端口配置?模块 DLL C:WINDOWSsystem32inetsrvaspnetcore.dll 未能加载。返回的数据为错误信息。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DELPHI字符串、数组操作函数(转)

对字符串及数组的操作,是每个程序员必须要掌握的。熟练的使用Delphi的这些函数,在编程时能更加得心应手。   1.Copy   功能说明:该函数用于从字符串中复制指定范围中的字符。该函数有3个参数。第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(   即个数)。最后函数返回一个新的字符串(即是我...

C#-微信公众平台接口-上传临时素材

最烦做微信公众平台的东西。。文档说得不清不楚,又没示例代码,只能自己 慢慢搜索,弄了一晚上,基本弄出来了,把本地的图片上传到微信的临时素材那里,返回媒体ID,用于其他操作,代码如下 :(自己导入相应的类System.Net.Http,JSON解析用的LitJson)         /// <summary>        /// 上传临时素材...

Idea中使用Redis的Java客户端和Jedis

Jedis   导入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5...

C#去掉json字符串中的换行符

【出错状况】 从数据库中返回json格式的数据,但由于数据库中的数据中有换行符,导致返回的json数据错误。 【原因分析】 用for循环语句来分析出错字段字符串中每个字符的ASCII码,可以看出存在值分别为13、10的两个字符,造成换行,导致json格式出错。            char tempstring = '\n';   (10)       ...

Java ---Listener监听器

在我们的web容器中,一直不断的触发着各种事件,例如:web应用启动和关闭,request请求到达和结束等。但是这些事件通常对于开发者来说是透明的,我们可以根据这些接口开发符合我们自身需求的功能。在web中常见的的几个监听事件如下: ServletContextListener:用于监听web应用的启动和关闭 ServletContextAttribut...

JAVA发送HTTP请求方式

1. HttpURLConnection 使用JDK原生提供的net,无需其他jar包; HttpURLConnection是URLConnection的子类,提供更多的方法,使用更方便。 package httpURLConnection; import java.io.BufferedReader; import java.io.InputStrea...