天天看點

Android控件狀态依賴架構

Z在生産型Android用戶端軟體(企業級應用)開發中,界面可能存在多個輸入(<code>EditText</code>)和多個操作(<code>MotionEvent</code>和<code>KeyEvent</code>),且操作依賴于輸入的狀态。如下圖所示的場景:

設定圖中

确認操作依賴于商品編碼和儲位的狀态

跳過操作不依賴于輸入狀态

登記差異操作依賴于儲位和數量的狀态

輸入框有三種狀态:

待輸入;

待校驗;

校驗成功。

操作需要當其依賴的輸入資料校驗成功,才能執行。

如果在Activity中去判斷輸入框狀态,那麼實際需要調用(3個輸入框)<code>*</code>(3種狀态)<code>*</code>(3個按鈕) = 27個 if 判斷,對于狀态的維護将使得整個程式可維護性極差,并随着輸入和操作的增加,維護的狀态呈指數增長。

通過對這種場景的抽象,實作了Android控件狀态依賴架構,其使用方法如下:

使用方法:

布局檔案引用<code>WatchEditText</code>和<code>WatchButton</code>

由于<code>Library Module</code>中的控件<code>id</code>不是常量(可參考<code>ButterKnife</code>對<code>Library Module</code>的支援采用<code>R2</code>的原因),這裡采用了<code>tag</code>的方式。

在<code>Activity中</code>通過注解申明依賴

<code>ViewName</code>定義控件名稱,<code>ViewDependency</code>中<code>dependency</code>指定其依賴的控件<code>tag</code>。

直接執行<code>onClick</code>和<code>onEditorAction</code>(修改狀态)

可以看出,這裡并沒有通過<code>if</code>判斷各個輸入控件的狀态。

<code>onEditorAction</code>模拟調用軟體的<code>Enter</code>進行校驗,這裡需要注意通過<code>editQuery1.complete()</code>修改該<code>EidtText</code>的狀态。

整個架構分為三個package:<code>annotation</code>、<code>state</code>和<code>view</code>。

在<code>annotation</code>中定義<code>ViewName</code>和<code>ViewDependency</code>注解,分别用于<code>WatchEditText</code>和<code>WatchButton</code>。<code>ViewName</code>指定<code>WatchEditText</code>控件在業務中的名稱,<code>ViewDependency</code>指定<code>WatchButton</code>依賴的<code>WatchEditText</code>控件;

在<code>state</code>中通過狀态模式定義<code>Enter</code>、<code>Verify</code>、<code>Complete</code>,其基類為抽象類<code>Operator</code>,定義方法<code>operator</code>;

<code>WatchEditText</code>和<code>WatchButton</code>定義控件的依賴關系。<code>WatchEditText</code>實作<code>ViewState</code>接口,其包含三種狀态的轉換方法。

本文轉自xsster51CTO部落格,原文連結: http://blog.51cto.com/12945177/1929759,如需轉載請自行聯系原作者

本文轉自xsster51CTO部落格,原文連結: 本文轉自xsster51CTO部落格,原文連結: ,如需轉載請自行聯系原作者

,如需轉載請自行聯系原作者

繼續閱讀