中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中的控件狀態需要依賴哪些框架

發布時間:2020-11-30 17:14:54 來源:億速云 閱讀:157 作者:Leah 欄目:移動開發

今天就跟大家聊聊有關Android中的控件狀態需要依賴哪些框架,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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

Android中的控件狀態需要依賴哪些框架

設定圖中

  • 確認操作依賴于商品編碼和儲位的狀態

  • 跳過操作不依賴于輸入狀態

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

輸入框有三種狀態:

  • 待輸入;

  • 待校驗;

  • 校驗成功。

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

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

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

使用方法:

1、布局文件引用WatchEditText和WatchButton

<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="buttonSearch2"
android:text="確認" />

由于Library Module中的控件id不是常量(可參考ButterKnife對Library 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 buttonSearch2;
@ViewDependency(name = @ViewName("跳過")/*不依賴輸入*/)
private WatchButton buttonSearch3;
@ViewDependency(name = @ViewName("登記缺貨"), dependency = {"editQuery2", "editQuery3"})
private WatchButton buttonSearch4;

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

3、直接執行onClick和onEditorAction(修改狀態)

@Override
public void onClick(View v) {
if (v == buttonSearch2) {
 Toast.makeText(this, "調接口", Toast.LENGTH_SHORT).show();
} else if (v == buttonSearch3) {
 Toast.makeText(this, "跳下一頁", Toast.LENGTH_SHORT).show();
} else if (v == buttonSearch4) {
 Toast.makeText(this, "登記缺貨", Toast.LENGTH_SHORT).show();
}
}

可以看出,這里并沒有通過if判斷各個輸入控件的狀態。

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

實現原理

整個框架分為三個package:annotation、state和view。

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

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ViewDependency {

ViewName name() default @ViewName;

String[] dependency() default {};
}

2、在state中通過狀態模式定義Enter、Verify、Complete,其基類為抽象類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;
}

@Override
public boolean operator(String operatorName, String viewName) {
 Toast.makeText(context, String.format("[%s]為空,不允許執行[%s]", viewName, operatorName),
  Toast.LENGTH_SHORT).show();
 return false;
}
}

3、WatchEditText和WatchButton定義控件的依賴關系。WatchEditText實現ViewState接口,其包含三種狀態的轉換方法。

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

看完上述內容,你們對Android中的控件狀態需要依賴哪些框架有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

明光市| 同心县| 青冈县| 那曲县| 和政县| 安龙县| 福州市| 陇南市| 安福县| 旬邑县| 泰来县| 龙里县| 天水市| 扶沟县| 盐源县| 互助| 绿春县| 栾川县| 洛隆县| 福海县| 密山市| 怀宁县| 嘉善县| 白山市| 伊春市| 岐山县| 大足县| 绥阳县| 开化县| 银川市| 宜昌市| 安达市| 阿坝县| 肥城市| 克什克腾旗| 会东县| 峡江县| 德阳市| 临猗县| 宜丰县| 仪陇县|