Android控件状态依赖框架

简介:

Z在生产型Android客户端软件(企业级应用)开发中,界面可能存在多个输入(EditText)和多个操作(MotionEventKeyEvent),且操作依赖于输入的状态。如下图所示的场景:

设定图中

  • 确认操作依赖于商品编码和储位的状态

  • 跳过操作不依赖于输入状态

  • 登记差异操作依赖于储位和数量的状态

输入框有三种状态:

  1. 待输入;

  2. 待校验;

  3. 校验成功。

操作需要当其依赖的输入数据校验成功,才能执行。

如果在Activity中去判断输入框状态,那么实际需要调用(3个输入框)*(3种状态)*(3个按钮) = 27个 if 判断,对于状态的维护将使得整个程序可维护性极差,并随着输入和操作的增加,维护的状态呈指数增长。

通过对这种场景的抽象,实现了Android控件状态依赖框架,其使用方法如下:

使用方法:

  1. 布局文件引用WatchEditTextWatchButton

    <com.android.yhthu.viewdependency.view.WatchEditTextandroid:id="@+id/edit_query_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:tag="editQuery1"android:imeOptions="actionNext"android:hint="商品编码"android:inputType="number"/>
    <com.android.yhthu.viewdependency.view.WatchButtonandroid:id="@+id/search_button_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:tag="buttonSearch1"android:text="确认" />

    由于Library Module中的控件id不是常量(可参考ButterKnifeLibrary Module的支持采用R2的原因),这里采用了tag的方式。

  2. Activity中通过注解申明依赖

    @ViewName("商品编码")private WatchEditText editQuery1;@ViewName("储位")private WatchEditText editQuery2;@ViewName("数量")private WatchEditText editQuery3;@ViewDependency(name = @ViewName("确认"), dependency = {"editQuery1", "editQuery2"})private WatchButton buttonSearch1;@ViewDependency(name = @ViewName("跳过")/*不依赖输入*/)private WatchButton buttonSearch2;@ViewDependency(name = @ViewName("登记缺货"), dependency = {"editQuery2", "editQuery3"})private WatchButton buttonSearch3;

    ViewName定义控件名称,ViewDependencydependency指定其依赖的控件tag

  3. 直接执行onClickonEditorAction(修改状态)

    @Overridepublic void onClick(View v) {if (v == buttonSearch1) {
        Toast.makeText(this, "调接口", Toast.LENGTH_SHORT).show();
    } else if (v == buttonSearch2) {
        Toast.makeText(this, "跳下一页", Toast.LENGTH_SHORT).show();
    } else if (v == buttonSearch3) {
        Toast.makeText(this, "登记缺货", Toast.LENGTH_SHORT).show();
    }
    }

    可以看出,这里并没有通过if判断各个输入控件的状态。

    @Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {if (actionId == EditorInfo.IME_ACTION_NEXT && v == editQuery1
            && (query1Str = editQuery1.getText().toString()).isEmpty()) {    if (query1Str.equals("12345")) {
            editQuery1.complete();        return true;
        }
    } 
    // 省略代码return false;
    }

    onEditorAction模拟调用软件的Enter进行校验,这里需要注意通过editQuery1.complete()修改该EidtText的状态。

实现原理

整个框架分为三个package:annotationstateview

  1. annotation中定义ViewNameViewDependency注解,分别用于WatchEditTextWatchButtonViewName指定WatchEditText控件在业务中的名称,ViewDependency指定WatchButton依赖的WatchEditText控件;

    @Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ViewDependency {
    
    ViewName name() default @ViewName;
    
    String[] dependency() default {};
    }
  2. state中通过状态模式定义EnterVerifyComplete,其基类为抽象类Operator,定义方法operator

    public abstract class Operator {// 操作对应的上下文protected Context context;// 操作public abstract boolean operator(String operatorName, String viewName);
    }
    public class Enter extends Operator {private static Enter enter;private Enter(Context context) {    this.context = context;
    }
    
    public static Enter getInstance(Context context) {    if (enter == null) {
            enter = new Enter(context);
        }    return enter;
    }@Overridepublic boolean operator(String operatorName, String viewName) {    Toast.makeText(context, String.format("[%s]为空,不允许执行[%s]", viewName, operatorName),            Toast.LENGTH_SHORT).show();    return false;
    }
    }
  3. WatchEditTextWatchButton定义控件的依赖关系。WatchEditText实现ViewState接口,其包含三种状态的转换方法。

    public interface ViewState {void enter();void verify();void complete();
    }













本文转自xsster51CTO博客,原文链接: http://blog.51cto.com/12945177/1929759,如需转载请自行联系原作者










本文转自xsster51CTO博客,原文链接: 本文转自xsster51CTO博客,原文链接: ,如需转载请自行联系原作者
,如需转载请自行联系原作者






相关文章
|
11月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation &#39;com.github.Yufseven:JMWorkProgress:v1.0&#39;`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
343 26
|
11月前
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
649 2
|
11月前
|
Android开发
Android控件样式的抽取(小提及快捷方式)
在Android开发中,若多个控件样式重复,可抽取公共部分以简化代码。例如对EditText提取样式,通过编辑`styles.xml`实现复用。为提高效率,Android Studio提供自动提取Style功能:右键点击控件样式选项,选择“Style...”,勾选需要提取的属性后确认,即可快速生成样式代码,显著提升开发便利性。
325 2
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
474 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
算法 JavaScript Android开发
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
919 1
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
947 8
|
开发工具 Android开发 git
Android实战之组件化中如何进行版本控制和依赖管理
本文介绍了 Git Submodules 的功能及其在组件化开发中的应用。Submodules 允许将一个 Git 仓库作为另一个仓库的子目录,有助于保持模块独立、代码重用和版本控制。虽然存在一些缺点,如增加复杂性和初始化时间,但通过最佳实践可以有效利用其优势。
240 3
下一篇
开通oss服务