Android控件狀態(tài)依賴框架

在生產(chǎn)型Android客戶端軟件(企業(yè)級應用)開發(fā)中壁榕,界面可能存在多個輸入(EditText)和多個操作(MotionEventKeyEvent)灸眼,且操作依賴于輸入的狀態(tài)。如下圖所示的場景:

Demo圖

設(shè)定圖中

  • 確認操作依賴于商品編碼和儲位的狀態(tài)
  • 跳過操作不依賴于輸入狀態(tài)
  • 登記差異操作依賴于儲位和數(shù)量的狀態(tài)

輸入框有三種狀態(tài):

  1. 待輸入帘瞭;
  2. 待校驗洋丐;
  3. 校驗成功苫幢。

操作需要當其依賴的輸入數(shù)據(jù)校驗成功,才能執(zhí)行垫挨。

如果在Activity中去判斷輸入框狀態(tài)韩肝,那么實際需要調(diào)用(3個輸入框)*(3種狀態(tài))*(3個按鈕) = 27個 if 判斷,對于狀態(tài)的維護將使得整個程序可維護性極差九榔,并隨著輸入和操作的增加哀峻,維護的狀態(tài)呈指數(shù)增長。

通過對這種場景的抽象哲泊,實現(xiàn)了Android控件狀態(tài)依賴框架剩蟀,其使用方法如下:

使用方法:

  1. 布局文件引用WatchEditTextWatchButton
<com.android.yhthu.viewdependency.view.WatchEditText
    android: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.WatchButton
    android: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的方式切威。

  1. Activity中通過注解申明依賴
@ViewName("商品編碼")
private WatchEditText editQuery1;
@ViewName("儲位")
private WatchEditText editQuery2;
@ViewName("數(shù)量")
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

  1. 直接執(zhí)行onClickonEditorAction(修改狀態(tài))
@Override
public void onClick(View v) {
    if (v == buttonSearch1) {
        Toast.makeText(this, "調(diào)接口", 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判斷各個輸入控件的狀態(tài)缰冤。

@Override
public 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模擬調(diào)用軟件的Enter進行校驗,這里需要注意通過editQuery1.complete()修改該EidtText的狀態(tài)喳魏。

實現(xiàn)原理

整個框架分為三個package:annotation棉浸、stateview

  1. annotation中定義ViewNameViewDependency注解刺彩,分別用于WatchEditTextWatchButton迷郑。ViewName指定WatchEditText控件在業(yè)務中的名稱,ViewDependency指定WatchButton依賴的WatchEditText控件创倔;
/**
 * 控件狀態(tài)依賴
 * Created by yanghao1 on 2016/12/19.
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ViewDependency {

    /**
     * 控件名稱(嵌套注解)
     *
     * @return
     */
    ViewName name() default @ViewName;

    /**
     * 控件狀態(tài)依賴
     *
     * @return
     */
    String[] dependency() default {};
}
  1. state中通過狀態(tài)模式定義Enter嗡害、VerifyComplete畦攘,其基類為抽象類Operator霸妹,定義方法operator
/**
 - 操作抽象接口
 - Created by yanghao1 on 2016/12/15.
 */
public abstract class Operator {

    // 操作對應的上下文
    protected Context context;

    /**
     * 操作
     *
     * @param operatorName 操作名稱
     * @param viewName     控件名稱
     * @return 是否可以執(zhí)行操作
     */
    public abstract boolean operator(String operatorName, String viewName);
}
/**
 - 待輸入狀態(tài)(初始狀態(tài))
 - Created by yanghao1 on 2016/12/19.
 */
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;
    }

    @Override
    public boolean operator(String operatorName, String viewName) {
        Toast.makeText(context, String.format("[%s]為空念搬,不允許執(zhí)行[%s]", viewName, operatorName),
                Toast.LENGTH_SHORT).show();
        return false;
    }
}
  1. WatchEditTextWatchButton定義控件的依賴關(guān)系抑堡。WatchEditText實現(xiàn)ViewState接口,其包含三種狀態(tài)的轉(zhuǎn)換方法朗徊。
/**
 * 控件狀態(tài)
 * Created by yanghao1 on 2016/12/15.
 */
public interface ViewState {

    /**
     * 待輸入狀態(tài)(初始狀態(tài))
     */
    void enter();

    /**
     * 待校驗狀態(tài)(有輸入(不為空)首妖,但未進行校驗,或校驗不成功)
     */
    void verify();

    /**
     * 有輸入爷恳,并且校驗成功
     */
    void complete();
}

以上有缆,Github地址:https://github.com/yhthu/AndroidViewDependency.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市温亲,隨后出現(xiàn)的幾起案子棚壁,更是在濱河造成了極大的恐慌,老刑警劉巖栈虚,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袖外,死亡現(xiàn)場離奇詭異,居然都是意外死亡魂务,警方通過查閱死者的電腦和手機曼验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粘姜,“玉大人鬓照,你說我怎么就攤上這事」陆簦” “怎么了豺裆?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長号显。 經(jīng)常有香客問我臭猜,道長,這世上最難降的妖魔是什么押蚤? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任获讳,我火速辦了婚禮,結(jié)果婚禮上活喊,老公的妹妹穿的比我還像新娘丐膝。我一直安慰自己,他們只是感情好钾菊,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布帅矗。 她就那樣靜靜地躺著,像睡著了一般煞烫。 火紅的嫁衣襯著肌膚如雪浑此。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天滞详,我揣著相機與錄音凛俱,去河邊找鬼紊馏。 笑死,一個胖子當著我的面吹牛蒲犬,可吹牛的內(nèi)容都是我干的朱监。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼原叮,長吁一口氣:“原來是場噩夢啊……” “哼赫编!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奋隶,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤擂送,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唯欣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘹吨,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年境氢,在試婚紗的時候發(fā)現(xiàn)自己被綠了躺苦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡产还,死狀恐怖匹厘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脐区,我是刑警寧澤愈诚,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站牛隅,受9級特大地震影響炕柔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媒佣,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一匕累、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧默伍,春花似錦欢嘿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狸剃,卻和暖如春掐隐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞馁。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工虑省, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匿刮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓探颈,卻偏偏與公主長得像熟丸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子膝擂,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,081評論 25 707
  • 《裕語言》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 26,669評論 5 19
  • 《ijs》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,123評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理虑啤,服務發(fā)現(xiàn)隙弛,斷路器架馋,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 今天是我的生日,感謝我的父母生育了我全闷,道一句爸媽你們辛苦了叉寂,把我養(yǎng)這么大,我在外面還讓你們擔心总珠,我一定會好好照...
    風追葉子閱讀 201評論 0 0