Android MVC Part3 The View

##什么是视图? 在 Android 中很多同学说 View 就是视图。但是 View 只有显示的能力,它不能处理响应和发送消息。先来看看视图的特点: 绑定模型 发送信息给控制器 处理控制器返回的信息 看来 activity 符合我们的要求,它可以绑定,可以处理信息,而且控制着 android 中所谓的 view 。但是 activity 又有一些其他的特性使它不像是 MVC 中的 V ,例如它管理着生命周期,而且它有一些像控制器的方法 boolean dispatchKeyEvent(KeyEvent event); boolean onOptionsItemSelected(MenuItem item); void onCreateContextMenu(….); so on…. 要知道 dispatchEvent 如果返回 true 表示这个 activity 会处理该事件。但是实际上,处理事件的逻辑应该交给控制器做的。 我们通过一些方法来避免上述的问题,使 activities 更像是一个视图。其灵感来源于这篇文章 为了把 activity 变成 view ,我们做了下面的操作。 ##1. 数据绑定 来看看 TapActivity 是如何绑定数据的 :::java package com.lingavin.tapcounter.activities; import com.lingavin.tapcounter.R; import com.lingavin.tapcounter.R.layout; import com.lingavin.tapcounter.vos.CounterVo; import com.lingavin.tapcounter.vos.OnChangeListener; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.Button; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.TextView; public class TapActivity extends Activity implements OnChangeListener { private static final String TAG = TapActivity.class.getSimpleName(); private CounterVo mCounterVo; private EditText label; private TextView count; private Button minusBtn; private Button plusBtn; private CompoundButton lockedBtn; private static final int UPDATE_VIEW = 0; private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what = msg.what; switch(what){ case UPDATE_VIEW: updateView(); break; default: } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCounterVo = new CounterVo(); mCounterVo.addListener(this); initViews(); } private void initViews() { lockedBtn = (CompoundButton) findViewById(R.id.lockBtn); ...... } @Override public void onChange(Object model) { mHandler.sendEmptyMessage(UPDATE_VIEW); } private void updateView(){ if(!label.getText().toString().equals(mCounterVo.getLabel())) label.setText(mCounterVo.getLabel()); label.setEnabled(!mCounterVo.isLocked()); count.setText(Integer.toString(mCounterVo.getCount())); lockedBtn.setChecked(mCounterVo.isLocked()); } } 在 onCreate 函数中我们实例化了 CounterVo 并把 TabActivity 作为观察者注册上 mCounterVo 。 ...

November 13, 2013

Android MVC Part1 Intro

##about 一直想寻找 android 关于基于 mvc 开发的教程, 但是国内的网站都讲得很空泛,最后在一个外国的 blog 里看到一系列的文章,介绍得很详细和具体,而且是基于项目的,所以转过来了。 这系列的文章不仅简述 MVC,还涉及到了状态模式的运用,如何用 Data Access Objects 来持久化数据,使用 web service 的命令来传递数据。这系列文章假设你已经了解用这些技术的好处,所以不会详细讲解为什么要这么用。 你可以通过点击这里查看原blog。 ##包管理 第一章先来建立工程并取好包名。好的包管理可以使明确你的类的大致作用,对编程有很大的帮助,试想下如果把所有 class 放到一个包中,当项目变大后,你想修改其中一个 class 将会是个噩梦。这里提供一个比较好的包的分类。 activities controllers daos lists models utils vos widgets 注意到所有的包名都是复数,因为里面不止一个 class 。上面的包名如果项目用不到可以删除。由包的名字我们就可以知道里面的类大致的功能,这就是好处。 activities – 很明显,这里会放入所有的 activity controllers – View 的大脑就放在这里面了 daos – 这里存放持久化逻辑 lists – 这里存放所有 list adapter models – 这里存放 View 绑定的 Model utils – 存放静态类和工具类 vos – 存放 Value Objects 也就是 POJOs 又或者 Data Transfer Objects widgets – 借鉴于android 存放定制化 widget part1 就到这里,源代码可以在这里下载 https://github.com/gavinlin/tapcounter ...

November 12, 2013