国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

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

2019-12-12 03:16:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

設(shè)定圖中

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

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

  • 待輸入;
  • 待校驗(yàn);
  • 校驗(yàn)成功。

操作需要當(dāng)其依賴的輸入數(shù)據(jù)校驗(yàn)成功,才能執(zhí)行。

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

通過(guò)對(duì)這種場(chǎng)景的抽象,實(shí)現(xiàn)了Android控件狀態(tài)依賴框架,其使用方法如下:

使用方法:

1、布局文件引用WatchEditText和WatchButton

<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="確認(rèn)" />

由于Library Module中的控件id不是常量(可參考ButterKnife對(duì)Library Module的支持采用R2的原因),這里采用了tag的方式。

2、在Activity中通過(guò)注解申明依賴

@ViewName("商品編碼")private WatchEditText editQuery1;@ViewName("儲(chǔ)位")private WatchEditText editQuery2;@ViewName("數(shù)量")private WatchEditText editQuery3;@ViewDependency(name = @ViewName("確認(rèn)"), dependency = {"editQuery1", "editQuery2"})private WatchButton buttonSearch1;@ViewDependency(name = @ViewName("跳過(guò)")/*不依賴輸入*/)private WatchButton buttonSearch2;@ViewDependency(name = @ViewName("登記缺貨"), dependency = {"editQuery2", "editQuery3"})private WatchButton buttonSearch3;

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

3、直接執(zhí)行onClick和onEditorAction(修改狀態(tài))

@Overridepublic void onClick(View v) {if (v == buttonSearch1) { Toast.makeText(this, "調(diào)接口", Toast.LENGTH_SHORT).show();} else if (v == buttonSearch2) { Toast.makeText(this, "跳下一頁(yè)", Toast.LENGTH_SHORT).show();} else if (v == buttonSearch3) { Toast.makeText(this, "登記缺貨", Toast.LENGTH_SHORT).show();}}

可以看出,這里并沒有通過(guò)if判斷各個(gè)輸入控件的狀態(tài)。

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

實(shí)現(xiàn)原理

整個(gè)框架分為三個(gè)package:annotation、state和view。

1、在annotation中定義ViewName和ViewDependency注解,分別用于WatchEditText和WatchButton。ViewName指定WatchEditText控件在業(yè)務(wù)中的名稱,ViewDependency指定WatchButton依賴的WatchEditText控件;

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ViewDependency {ViewName name() default @ViewName;String[] dependency() default {};}

2、在state中通過(guò)狀態(tài)模式定義Enter、Verify、Complete,其基類為抽象類Operator,定義方法operator;

public abstract class Operator {// 操作對(duì)應(yīng)的上下文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]為空,不允許執(zhí)行[%s]", viewName, operatorName),  Toast.LENGTH_SHORT).show(); return false;}}

3、WatchEditText和WatchButton定義控件的依賴關(guān)系。WatchEditText實(shí)現(xiàn)ViewState接口,其包含三種狀態(tài)的轉(zhuǎn)換方法。

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

以上,博客園對(duì)markdown支持的不太好,無(wú)法添加注釋(/* */),如需查看源碼,請(qǐng)移步Github地址:https://github.com/yhthu/AndroidViewDependency.git

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤阳县| 舒兰市| 桂东县| 浮山县| 伊宁县| 郎溪县| 卢龙县| 会理县| 唐山市| 江华| 定日县| 宜阳县| 象山县| 丹阳市| 万安县| 巢湖市| 开阳县| 象州县| 宁津县| 永顺县| 胶州市| 黄梅县| 衡阳市| 宁晋县| 伊金霍洛旗| 巨野县| 辽中县| 如东县| 融水| 临颍县| 博爱县| 和平区| 吉安市| 礼泉县| 普兰店市| 荥阳市| 克山县| 镶黄旗| 黔西县| 竹山县| 盱眙县|