这篇文章是我个人在开发与设计APP的所用的一些设计思路,仅用于和大家分享知识并不是什么设计标准之类的。主要说明App的开发中是如何来开发与组织UI部分。

UI模块结构

在项目中建立ui包用于存放ui类文件。这是第一步第二步是建立相应的组件包名: activityfragmentwidgetadapterwidget等以上是最基本的组件现在ui结构如下:

基类设计

base存放ui通用的部分,结构如下:

UIDelegate

定义一些常用的UI操作如: ToastDialog获取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提供最基本的ToastDialog显示功能部分代码如下:

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

定义ActivityFragment通信时所用到的一些常量参数。

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具备显示ToastDialog等功能。

public interface IView extends UIDelegate{

}



《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。

APP设计与开发(ui篇)的更多相关文章

  1. iOS开发UI篇—APP主流UI框架结构

    iOS开发UI篇—APP主流UI框架结构 一.简单示例 说明:使用APP主流UI框架结构完成简单的界面搭建 搭建页面效果:                                二.搭建过程和 ...

  2. iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建

    iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...

  3. iOS开发UI篇—九宫格坐标计算

    iOS开发UI篇—九宫格坐标计算 一.要求 完成下面的布局 二.分析 寻找左边的规律,每一个uiview的x坐标和y坐标. 三.实现思路 (1)明确每一块用得是什么view (2)明确每个view之间 ...

  4. iOS开发UI篇—字典转模型

    iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 // // LFViewController.m // 03-应用管理 // // Creat ...

  5. iOS开发UI篇—xib的简单使用

    iOS开发UI篇—xib的简单使用 一.简单介绍 xib和storyboard的比较,一个轻量级一个重量级. 共同点: 都用来描述软件界面 都用Interface Builder工具来编辑 不同点: ...

  6. iOS开发UI篇—从代码的逐步优化看MVC

    iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他 ...

  7. iOS开发UI篇—常见的项目文件介绍

    iOS开发UI篇—常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...

  8. iOS开发UI篇—程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  9. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

随机推荐

  1. 在 react 项目里如何配合immutable在redux中使用

    一.reducer文件的处理 先安装 immutable 与 redux-immutable yarn add immutable redux-immutable 我们可能会在很多地方定义子树,这就需 ...

  2. Delphi - Indy TIdFTP控件实现文件的上传和下载

    FTP信息保存和获取 我们在做FTP相关开发时,为方便后续FTP切换,一般先把FTP账户信息保存到数据库表中,在使用时再通过Query获取出来. 一般通过如下方式获取到FTP相关信息,代码如下: // ...

  3. Netty源码分析 (二)----- ServerBootstrap

    BootStrap在netty的应用程序中负责引导服务器和客户端.netty包含了两种不同类型的引导: 1. 使用服务器的ServerBootStrap,用于接受客户端的连接以及为已接受的连接创建子通 ...

  4. 学生管理系统 Python语言

    def show_student(): print(('*'*20).center(55)) print('1.添加学生信息'.center(50)) print('2.修改学生信息'.center( ...

  5. Reactive(2) 响应式流与制奶厂业务

    目录 再谈响应式 为什么Web后端开发的,对 Reactive 没有感觉 Java 9 支持的 Reactive Stream 范例 小结 扩展阅读 再谈响应式 在前一篇文章从Reactive编程到& ...

  6. python控制窗口移动(画圆)

    import win32con import win32gui import time import math notepad = win32gui.FindWindow("Notepad& ...

  7. CF 990D Graph And Its Complement 第十八 构造、思维

    Graph And Its Complement time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  8. extends 关键字

    来源于百度: 在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. 例子1:public class Clie ...

  9. Quartz.Net使用教程

    在项目的开发过程中,难免会遇见后需要后台处理的任务,例如定时发送邮件通知.后台处理耗时的数据处理等,这个时候你就需要Quartz.Net了. Quartz.Net是纯净的,它是一个.Net程序集,是非 ...

  10. Ubuntu16.4安装Vivado Design Suite sdx2019.1

    1:下载安装包.到Xilinx官网下载下面为网址: https://www.xilinx.com/support/download.html 2:进入安装包路径,打开终端 Ctrl+alt +t sh ...