APP设计与开发(ui篇)
这篇文章是我个人在开发与设计APP的所用的一些设计思路,仅用于和大家分享知识并不是什么设计标准之类的。主要说明App的开发中是如何来开发与组织UI部分。
UI模块结构
在项目中建立ui
包用于存放ui
类文件。这是第一步第二步是建立相应的组件包名: activity
、fragment
、widget
、adapter
、widget
等以上是最基本的组件现在ui
结构如下:
基类设计
base
存放ui
通用的部分,结构如下:
UIDelegate
定义一些常用的UI操作如: Toast
、Dialog
、获取Resources
等功能。
public interface UIDelegate {
Toast makeToast(String msg, int len);
void showToastShort(String msg);
void showToastLong(String msg);
void showToastShort(@StringRes int msg);
void showToastLong(@StringRes int msg);
Dialog showWaitDialog(@StringRes int msg);
Dialog showWaitDialog(String msg);
Dialog showWaitDialog(@NonNull String msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback);
Dialog showWaitDialog(@StringRes int msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback);
void dismissWaitDialog();
}
BaseActivity
继承Activity
实现最基本的功能如打印生命周期
、获取参数
等BaseActivity
实现UIDelegate
提供最基本的Toast
与Dialog
显示功能部分代码如下:
public abstract class BaseActivity extends AppCompatActivity implements UIDelegate{
private static final String ACTIVITY_LIFE_CYCLE_TAG = "activity_life_cycle";
private static final String LOG_FORMAT = "%s: %s";
private ProgressDialog mWaitDialog;
// activity life cycle start
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LianLianLog.d(ACTIVITY_LIFE_CYCLE_TAG, LOG_FORMAT, this.getLocalClassName(), "onCreate");
ActivityStack.getActivityStack().addActivity(this);
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key, T defaultValue){
Bundle bundle = getIntent().getExtras();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return defaultValue;
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key){
Bundle bundle = getIntent().getExtras();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return null;
}
@Override
public Toast makeToast(String msg, int len) {
if(TextUtils.isEmpty(msg))
return null;
return Toast.makeText(this, msg, len);
}
@Override
public void showToastShort(String msg) {
Toast toast = makeToast(msg, Toast.LENGTH_SHORT);
if(toast != null)
toast.show();
}
@Override
public void showToastLong(String msg) {
makeToast(msg, Toast.LENGTH_LONG).show();
Toast toast = makeToast(msg, Toast.LENGTH_LONG);
if(toast != null)
toast.show();
}
@Override
public void showToastShort(@StringRes int msg) {
showToastShort(getString(msg));
}
@Override
public void showToastLong(@StringRes int msg) {
showToastLong(getString(msg));
}
@Override
public Dialog showWaitDialog(@StringRes int msg) {
return showWaitDialog(getString(msg));
}
@Override
public Dialog showWaitDialog(String msg) {
return showWaitDialog(msg, false, null);
}
@Override
public Dialog showWaitDialog(@NonNull String msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
if(mWaitDialog == null) {
mWaitDialog = ProgressDialog.show(this, null, msg, true, cancelable, callback);
mWaitDialog.setCanceledOnTouchOutside(false);
}else{
mWaitDialog.setMessage(msg);
mWaitDialog.show();
}
return mWaitDialog;
}
@Override
public Dialog showWaitDialog(@StringRes int msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
return showWaitDialog(getString(msg), cancelable, callback);
}
@Override
public void dismissWaitDialog() {
if(mWaitDialog != null)
mWaitDialog.dismiss();
mWaitDialog = null;
}
}
BaseFragment
同样也实现UIDelegate
接口但是他的功能其实是由BaseActivity
去完成的部分代码如下:
public class BaseFragment extends Fragment implements UIDelegate {
private static final String FRAGMENT_LIFE_CYCLE_TAG = "fragment_life_cycle";
private static final String LOG_FORMAT = "%s: %s";
private UIDelegate mDelegate;
@Override
public void onAttach(Context context) {
super.onAttach(context);
LianLianLog.d(FRAGMENT_LIFE_CYCLE_TAG, LOG_FORMAT, getLogTag(), "onAttach");
if(context instanceof UIDelegate)
mDelegate = (UIDelegate) context;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
LianLianLog.d(FRAGMENT_LIFE_CYCLE_TAG, LOG_FORMAT, getLogTag(), "onActivityCreated");
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key, T defaultValue){
Bundle bundle = getArguments();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return defaultValue;
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key){
Bundle bundle = getArguments();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return null;
}
private String getLogTag() {
return getTag() != null ? getTag() : getClass().getSimpleName();
}
@Override
public Toast makeToast(String msg, int len) {
return mDelegate != null ? mDelegate.makeToast(msg, len) : null;
}
@Override
public void showToastShort(String msg) {
if(mDelegate != null)
mDelegate.showToastShort(msg);
}
@Override
public void showToastLong(String msg) {
if(mDelegate != null)
mDelegate.showToastLong(msg);
}
@Override
public void showToastShort(@StringRes int msg) {
if(mDelegate != null)
mDelegate.showToastShort(msg);
}
@Override
public void showToastLong(@StringRes int msg) {
if(mDelegate != null)
mDelegate.showToastLong(msg);
}
@Override
public Dialog showWaitDialog(@StringRes int msg) {
return mDelegate != null ? mDelegate.showWaitDialog(msg) : null;
}
@Override
public Dialog showWaitDialog(String msg) {
return mDelegate != null ? mDelegate.showWaitDialog(msg) : null;
}
@Override
public Dialog showWaitDialog(@NonNull String msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
return mDelegate != null ? mDelegate.showWaitDialog(msg, cancelable, callback) : null;
}
@Override
public Dialog showWaitDialog(@StringRes int msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
return mDelegate != null ? mDelegate.showWaitDialog(msg, cancelable, callback) : null;
}
@Override
public void dismissWaitDialog() {
if(mDelegate != null)
mDelegate.dismissWaitDialog();
}
}
UIConstant
定义Activity
或Fragment
通信时所用到的一些常量参数。
public class UIConstant {
String EXTRA_NAME = "extra_name";
String EXTRA_PHONE = "extra_phone";
}
UIHelper
包含一系列的辅助方法如在多人开发过程中你写了一个Activity
但是要启动这个 Activity
必需要带一些参数由于是个人开发的别人也不清楚如何去调用这里推荐在UIHelper
中声明如何去启动这个Activity
。
public class UIHelper {
public static void startInfoActivity(Context context,String phone){
Intent intent = new Intent(context, InfoActivity.class);
intent.putExtra(UIConstant.EXTRA_PHONE, phone);
intent.setPackage(context.getPackageName());
context.startActivity(intent);
}
public static boolean sdkCompare(int sdkInt){
return Build.VERSION.SDK_INT >= sdkInt;
}
public static boolean isDestroyed(Activity activity){
if(UIHelper.sdkCompare(Build.VERSION_CODES.JELLY_BEAN_MR1)){
return activity.isDestroyed();
}
return activity.isFinishing();
}
}
使用MVP
使用MVP
开发模式隔离业务与模型减少View
的代码。让View
实现UIDelegate
这样Presenter
具备显示Toast
、Dialog
等功能。
public interface IView extends UIDelegate{
}
《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。
APP设计与开发(ui篇)的更多相关文章
- iOS开发UI篇—APP主流UI框架结构
iOS开发UI篇—APP主流UI框架结构 一.简单示例 说明:使用APP主流UI框架结构完成简单的界面搭建 搭建页面效果: 二.搭建过程和 ...
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...
- iOS开发UI篇—九宫格坐标计算
iOS开发UI篇—九宫格坐标计算 一.要求 完成下面的布局 二.分析 寻找左边的规律,每一个uiview的x坐标和y坐标. 三.实现思路 (1)明确每一块用得是什么view (2)明确每个view之间 ...
- iOS开发UI篇—字典转模型
iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 // // LFViewController.m // 03-应用管理 // // Creat ...
- iOS开发UI篇—xib的简单使用
iOS开发UI篇—xib的简单使用 一.简单介绍 xib和storyboard的比较,一个轻量级一个重量级. 共同点: 都用来描述软件界面 都用Interface Builder工具来编辑 不同点: ...
- iOS开发UI篇—从代码的逐步优化看MVC
iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他 ...
- iOS开发UI篇—常见的项目文件介绍
iOS开发UI篇—常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...
- iOS开发UI篇—程序启动原理和UIApplication
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
随机推荐
- GitExtensions使用教程
GitExtensions工具使用教程 第一步:安装 1.双击:GitExtensions24703SetupComplete.msi <ignore_js_op> image001.pn ...
- EF的3种开发模式
那么明显开发模式是三种. 即:DateBase First(数据库优先).Model First(模型优先)和Code First(代码优先). 当然,如果把Code First模式的两种具体方式独立 ...
- SCRUM的三个工件
转自:http://www.scrumcn.com/agile/scrum-knowledge-library/scrum.html#tab-id-6 Scrum 的工件以不同的方式展现工作和价值,可 ...
- About 睡觉觉吃饭饭
rdc 的日常作息: 11:50 左右起床,洗漱后飞奔到超市买咖啡饼干,然后飞奔到实验室. 开始被比赛打:比赛前期觉没睡醒,题没读懂就开始乱写,签到签不上,比赛中期处于要被饿死的状态. 赛后吃饭饭,随 ...
- hdu 3038 How Many Answers Are Wrong(并查集的思想利用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:就是给出n个数和依次m个问题,每个问题都是一个区间的和,然后问你这些问题中有几个有问题,有 ...
- gulp的介绍和手动安装
gulp, 前端自动化工具, 文件操作, 项目上线之前,将碎片文件合并,将ES6转成ES5,文件压缩,快速搭建服务器... gulp基于node环境 gulp就是node的一个非内置的小模块 gulp ...
- java第一次测验
package kaoshi; import java.util.Scanner; public class ScoreManagement { static int t=0; static int ...
- MyBatis中#{}和${}的区别详解
首先看一下下面两个sql语句的区别: <select id="selectByNameAndPassword" parameterType="java.util.M ...
- cmd命令查看已连接的WiFi密码
实验环境:Windows 10.命令提示符(管理员权限) 一.CMD命令查看WiFi密码 使用方法: ①.运行CMD(命令提示符) (确保无线网卡启用状态)②.输入命令查看WiFi配置文件: # ...
- Android四大组件初识之Activity
一.Activity的生命周期 Activity生命周期是一系列方法调用.熟悉各个方法调用时间,我们在创建activity就能根据具体实现选择合适的方法覆盖. 1. 覆盖Activity的生命周期方 ...