1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 最老程序员创业开发实训12---Android---在MVC架构下Activity设计及实现

最老程序员创业开发实训12---Android---在MVC架构下Activity设计及实现

时间:2018-07-22 18:33:34

相关推荐

最老程序员创业开发实训12---Android---在MVC架构下Activity设计及实现

在上一节中,我们讲述了如何在Android平台下,以MVC架构为指导,实现模型类的方法。在本节中,我们要重点讨论一下,怎样设计Activity类,作为MVC中的控制器,并在其中使用我们在上节所讲述的模型类。在这里我们只讨论重要的代码,对于资源文件及Activity页面设计及实现细节,由于篇幅所限,就只能略过了,大家可以在稍后公布的项目下载包中查看相应的代码。

我们以具体项目WkgJys项目为例,项目在首次运行时,Splash页面之后,会进入JysAppTourActivity,在看完所有介绍页面之后,点击进入应用按钮,由于是程序第一次运行,为进入JysRegisterLoginActivity对应的页面,并且状态为注册状态。我们就从这里开始讨论。

首先,有一些公共功能,如按回退键提示用户是否退出系统等功能,我们需要定义一个项目中所有Activity的基类WkyActivity,代码如下所示:

/*** 所有Activity的基类* @author 闫涛 .09.18**/public class WkyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); // 不显示TitleBar// 连屏幕上的状态栏也不显示//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 在manifest文件中对每个activity android:theme="@android:style/Theme.NoTitleBar.Fullscreen"handler = new Handler();}/*** Activity在onCreate时会初始化其对应的Model类,因此在销毁时也需要移除该对象* 【闫涛 .09.17】初始版本*/@Overridepublic void onDestroy() {super.onDestroy();if (!model.isShared()) {WkyModel.removeObject(model.getObjectId());}}/*** 用户点击回退按钮时,提示用户是否退出应用,如果选择确定,则退出应用* 【闫涛 .09.18】实始版本*/@Overridepublic void onBackPressed() {new AlertDialog.Builder(this).setTitle("确定退出吗?").setNeutralButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.exit(1);//myApplication.closeApp();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.cancel();}}).show();}protected Handler handler = null; // 用于响应消息总线protected WkyModel model = null;protected Activity thisActivity = null;}

在上面的代码中,提醒大家注意handler属性,这是为了后面将要讨论到的消息总线机制设计的。如果某些Activity需要响应消息总线上的消息,就需要将该handler注册到消息总线上去,这部分内容我们会在以后谈到。

在用户浏览完应用介绍页面之后,会调用JysAppTourActivity的这个函数:

/*** 启动注册登录页面,并关闭本页* 【闫涛 .09.11】初始版本*/@Overrideprotected void goRegisterLoginActivity() {JysRegisterLoginModel model = (JysRegisterLoginModel)WkyModel.getInstance(JysRegisterLoginModel.class.getCanonicalName() + WkyConstants.MODEL_OBJECT_DEFAULT, JysRegisterLoginModel.class);model.setObjectId(JysRegisterLoginModel.class.getCanonicalName() + WkyConstants.MODEL_OBJECT_DEFAULT);model.setState(JysRegisterLoginModel.STATE_REGISTER);Intent intent = new Intent(this, JysRegisterLoginActivity.class);startActivity(intent);finish();}

在这个函数中,会首先初始化一个JysRegisterLoginModel类的实例,方法为调用基类WkyModel.getInstance方法,当生成JysRegisterLoginModel类实例后,将标识设置为类的全名加default(在后面JysRegisterLoginActivity中会根据这个ID来获取本实例,同时会在onDestroy回调中,删除此ID的对象),将界面状态置为注册。

下面是JysRegisterLoginActivity类,由于该类中有很大一部分代码是用于实现界面的,这里就不重点介绍了。这里只重点介绍与MVC架构相关的内容。要理解本类,我们需要从其基类入手。

首先是WkyRegisterLoginModel.onCreate方法:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_register_login);moveHeight = DensityUtil.dip2px(this, 50);inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);model = getRegisterLoginModel();wkyRegisterLoginModel = (WkyRegisterLoginModel)model;thisActivity = this;int state = wkyRegisterLoginModel.getState();}

这里首先通过调用具体应用中的子类(JysRegisterLoginModel类)的getRegisterLoginModel方法,取出先前生成的模型类对象,并取出保存在其中的状态。

在具体应用中,如JysRegisterLoginModel.onCreate中,进行具体的初始化操作:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(com.weikangyun.wkylib.R.layout.activity_register_login);getViewObjects();setupGuis();setupActionListeners();}/*** 生成并获取本Activity对应的模型类实例* 【闫涛 .09.18】初始版本*/protected WkyModel getRegisterLoginModel() {return WkyModel.getInstance(JysRegisterLoginModel.class.getCanonicalName() + WkyConstants.MODEL_OBJECT_DEFAULT, JysRegisterLoginModel.class);}

上面代码首先设置布局文件,然后获取界面上View对象,然后根据模型类内容,初始化界面,最后是设置界面上事件响应函数。上述步骤与IOS中的基本相同,其中getViewObjects在IOS中是设置IBOutlets,而setupActionListeners对应IOS中的IBAction。

下面来看getViewObjects方法实现:

/*** 获取界面上所有View对象* 【闫涛 .09.12】初始版本*/protected void getViewObjects() {contentView = (View)findViewById(R.id.content_view);rootView = (WkyKbRelativeLayout)findViewById(R.id.registerLoginRoot);scrollView = (ScrollView)findViewById(R.id.scrollview);loginNameEdtt = (WkyEditText)findViewById(R.id.login_name_edtt);loginPwdEdtt = (WkyEditText)findViewById(R.id.login_pwd_edtt);loginTempEdtt = (WkyEditText)findViewById(R.id.login_temp_edtt);forgetPwdTxtv = (TextView)findViewById(R.id.forget_pwd_txtv);userAgreementTxtv = (TextView)findViewById(R.id.user_agreement_txtv);switchStateTxtv = (TextView)findViewById(R.id.switch_state_txtv);clearLoginNameImgv = (ImageView)findViewById(R.id.clear_login_name_imgv);clearLoginPwdImgv = (ImageView)findViewById(R.id.clear_login_pwd_imgv);registerOrLoginImgv = (ImageView)findViewById(R.id.register_or_login_imgv);userAgreementLrlt = (LinearLayout)findViewById(R.id.user_agreement_lrlt);switchStateLabelTxtv = (TextView)findViewById(R.id.switch_state_label_txtv);}

实际上就是将页面上的View保存到对应的属性中。下一步是根据模型类中的数据,通过setupGuis方法来设置显示界面,代码如下所示:

/*** 根据状态设置界面元素是否显示* 【闫涛 .09.12】初始版本*/protected void setupGuis() {switch (wkyRegisterLoginModel.getState()) {case WkyRegisterLoginModel.STATE_REGISTER:forgetPwdTxtv.setVisibility(View.GONE);userAgreementLrlt.setVisibility(View.VISIBLE);switchStateTxtv.setText("登录");switchStateLabelTxtv.setText("已有帐号?点击 ");registerOrLoginImgv.setImageResource(R.drawable.register);break;case WkyRegisterLoginModel.STATE_LOGIN:forgetPwdTxtv.setVisibility(View.VISIBLE);userAgreementLrlt.setVisibility(View.INVISIBLE);switchStateTxtv.setText("注册");switchStateLabelTxtv.setText("没有帐号?点击 ");registerOrLoginImgv.setImageResource(R.drawable.login);loginPwdEdtt.setHint("密码");forgetPwdTxtv.setText("忘记密码");break;case WkyRegisterLoginModel.STATE_FORGET_PWD:registerOrLoginImgv.setImageResource(R.drawable.reset_password);loginPwdEdtt.setHint("设置一个新密码,6-15位");forgetPwdTxtv.setText("返回登录");userAgreementLrlt.setVisibility(View.INVISIBLE);break;case WkyRegisterLoginModel.STATE_ACTIVATE:break;}clearLoginNameImgv.setVisibility(View.GONE);clearLoginPwdImgv.setVisibility(View.GONE);}

在本方法中,根据模型类JysRegisterLoginModel对象中保存的状态信息,显示相应的内容。这里一共有四种状态:注册、登录、忘记密码和激活。

接下来我们在setupActionListeners方法中,添加界面事件响应函数的定义:

/*** 设置界面上各个View的消息响应函数* 【闫涛 .09.12】初始版本*/protected void setupActionListeners() {listenSoftKeyboardState();setUserAgreementLrltOnClickListener();setClearLoginNameImgvOnClickListener(); // 清空登录名内容setClearLoginPwdImgvOnClickListener(); // 清空密码setLoginNameEdttOnFocusChangeListener(); // 登录名失去获取焦点时显示或隐藏清除图标setLoginPwdEdttOnFocusChangeListener(); // 密码失去焦点时显示或隐藏右侧清除图标addLoginNameEdttTextChangedListener();addLoginPwdEdttTextChangedListener();setSwitchStateTxtvOnClickListener();setForgetPwdTxtvOnClickListener();setRegisterOrLoginImgvOnClickListener();}

分别作如下操作:监听软键盘状态用户点击用户协议的消息响应函数,利用WebView来显示用户协议登录名清空图标的消息响应函数登录密码清空图标的消息响应函数登录名失去焦点的消息响应函数登录密码失去焦点的消息响应函数登录名内容改变消息响应函数登录密码内容改变消息响应函数状态切换(注册、登录、忘记密码、激活)消息响应函数忘记密码点击的消息响应函数注册或登录按钮消息响应函数完成这些工作后,当用户点击注册时,就可以进入注册流程了。在下一节中,我们将首先讲一下Android平台下网络请求的实现方式,我们这里采用异步任务的方式来处理网络请求。

华丽的分隔线

******************************************************************************************************************************************************************************

希望大家多支持,有大家的支持,我才能走得更远,谢谢!

银行账号:622202 0200 1078 56128 闫涛

我的支付宝:yt7589@

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。