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部落格,原文連結: ,如需轉載請自行聯系原作者
,如需轉載請自行聯系原作者