1. 程式人生 > >安卓button點選事件設定

安卓button點選事件設定

遮蔽多次點選事件

?

1

2

3

4

5

6

7

8

9

10

11

12

/**

* 測試快速點選事件

*/

fastButton.setOnClickListener(new OnClickFastListener() {

/**

* 自定義實現的抽象方法,不在重寫onClick方法,該方法用於執行點選後的邏輯

*/

@Override

public void onFastClick(View v) {

Toast.makeText(mContext,

"您點選了測試網路按鈕...", Toast.LENGTH_LONG).show();

}

});

這裡的fastButton就是一個普通的按鈕元件,然後我們為該元件設定了點選事件,並且傳入的是我們自定義的OnClickListener類(這裡需要說明的是,不只是button元件任何View元件的點選事件都是可以的,這裡只是以Button元件為例子),這裡預設的遮蔽多次點選事件的時間間隔為900ms,也就是說當我們為元件設定了我們自定義的點選事件監聽之後,假如有兩次點選事件,並且第二次點選時若距離第一次點選事件小於0.9s,則第二次點選不會起作用;

遮蔽網路情況

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/**

* 測試網路狀況

*/

networkButton.setOnClickListener(new OnClickNetworkListener() {

/**

* 自定義實現的抽象方法,主要用於執行有網路之後的邏輯

*/

@Override

public void onNetworkClick(View v) {

Toast.makeText(mContext, "當前裝置有網路,執行後續操作...", Toast.LENGTH_LONG).show();

}

/**

* 自定義實現的抽象方法,主要用於執行當前裝置沒有網路之後的邏輯

*/

@Override

public void onNoNetworkClick(View v) {

Toast.makeText(mContext, "當前裝置沒有網路...", Toast.LENGTH_LONG).show();

}

});

同樣的,這裡的networkButton也是我們自定義的一個按鈕元件,我們為其設定了點選事件監聽,並傳入了我們自定義的OnNetworkClickListener類,可以發現OnNetworkClickListener類中有兩個回撥方法,其中onNetworkClick方法用於執行當前裝置有網的情況,而onNoNetworkClick方法用於處理當前裝置沒有網路的後續操作;

遮蔽是否登入情況

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/**

* 測試是否登陸

*/

loginButton.setOnClickListener(new OnClickLoginedListener(mContext) {

/**

* 自定義實現的抽象方法,用於判斷當前裝置是否登入

*/

@Override

public boolean isLogined(Activity context, View view) {

return false;

}

/**

* 主要用於執行判斷使用者登入之後執行的邏輯

*/

@Override

public void onLoginedClick(View v) {

Toast.makeText(mContext, "裝置已登入,之後後續操作...", Toast.LENGTH_LONG).show();

}

/**

* 主要用於執行判斷使用者未登入之後執行的邏輯

*/

@Override

public void onNoLoginedClick(View v) {

Toast.makeText(mContext, "裝置未登陸,無法執行後續操作...", Toast.LENGTH_LONG).show();

}

});

這裡的loginButton同樣是我們自定義的一個按鈕元件,併為其設定了我們的OnLoginedClickListener類,然後其中有三個回撥方法,

其中方法isLogined用於判斷當前使用者是否登入,返回為true則表示使用者已經登入,返回為false則表示使用者未登入,具體實現邏輯需要在業務層實現,方法onLoginedClick用於執行登入之後的邏輯,而方法onNoLoginedClick用於執行使用者尚未登入的邏輯。

這就是這個類庫大概的實現功能,說完功能之後我們來看一下其具體實現邏輯:

實現方式

上面我們講解了該類庫的使用方式,那麼我們是如何實現的呢?下面我們看一下該類庫的原始碼。

防止按鈕重複點選

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

/**

* 方法按鈕重複點選的監聽類原始碼

*/

public abstract class OnClickFastListener extends BaseClickListener {

// 防止快速點選預設等待時長為900ms

private long DELAY_TIME = 900;

private static long lastClickTime;

private boolean isFastDoubleClick() {

long time = System.currentTimeMillis();

long timeD = time - lastClickTime;

if (0 < timeD && timeD < DELAY_TIME) {

return true;

}

lastClickTime = time;

return false;

}

@Override

public void onClick(View v) {

// 判斷當前點選事件與前一次點選事件時間間隔是否小於闕值

if (isFastDoubleClick()) {

return;

}

onFastClick(v);

}

/**

* 設定預設快速點選事件時間間隔

* @param delay_time

* @return

*/

public OnClickFastListener setLastClickTime(long delay_time) {

this.DELAY_TIME = delay_time;

return this;

}

/**

* 快速點選事件回撥方法

* @param v

*/

public abstract void onFastClick(View v);

}

以上就是我們防止按鈕重複點選的OnFastClickListener的原始碼了,可以看到這裡我們定義了防止重複點選的OnClickListener物件,並重寫了其onClick方法,可以看到我們在onClick方法中呼叫了isFastDoubleClick方法,該方法就是具體實現是否重複點選邏輯的,當按鈕上一次點選的時間與本次點選的時間間隔小於900ms的時候isFastDoubleClick方法就會返回為true,這時候onClick方法直接返回,不在執行後續的onFastClick方法,否則就直接執行onFastClick方法。然後我們在為我們的View元件設定點選事件的時候只需要重寫onFastClick方法就好了。。。

按鈕點選監聽網路狀況

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

/**

* 判斷當前裝置是否有網路的監聽類原始碼

*/

public abstract class OnClickNetworkListener extends BaseClickListener {

@Override

public void onClick(View v) {

boolean isNetworkOk = isNetworkConnected(v.getContext());

if (isNetworkOk) {

onNetworkClick(v);

} else {

onNoNetworkClick(v);

}

}

// 點選事件--有網路

public abstract void onNetworkClick(View v);

// 點選事件--沒有網路

public abstract void onNoNetworkClick(View v);

/**

* 網路連線是否正常

*

* @param context

* @return

*/

public static boolean isNetworkConnected(Context context) {

if (context != null) {

ConnectivityManager mConnectivityManager = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();

if (mNetworkInfo != null) {

return mNetworkInfo.isAvailable();

}

}

return false;

}

}

和剛剛的防止按鈕重複點選事件類似,這裡也是重寫了自己的OnClickListener物件,然後重寫了其onClick方法,並在其中執行isNetworkConnected方法,該方法就是判斷是否當前裝置是否有網路,若有網路則執行onNetworkClick方法,若無網路則執行onNoNetworkClick方法,這樣當我們為自己的View元件設定點選事件的時候只需要為View元件設定onClickListener為我們自定義的OnClickListener物件,然後重寫其中的onNetworkClick和onNoNetworkClick方法,其中onNetworkClick方法為有網路的回撥方法,而onNoNetworkClick方法為無網路的回撥方法。

按鈕點選監聽是否登入

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

/**

* 判斷當前App使用者是否登入的監聽原始碼

*/

public abstract class OnClickLoginedListener extends BaseClickListener {

private Activity context = null;

public OnClickLoginedListener(Activity context) {

this.context = context;

}

@Override

public void onClick(View view) {

super.onClick(view);

if (isLogined(context, view)) {

onLoginedClick(view);

} else {

onNoLoginedClick(view);

}

}

/**

* 判斷當前使用者是否登入

* @param context

* @param view

* @return

*/

public abstract boolean isLogined(Activity context, View view);

/**

* 使用者登入之後執行的邏輯

* @param v

*/

public abstract void onLoginedClick(View v);

/**

* 使用者未登入執行點選事件

*/

public abstract void onNoLoginedClick(View v);

}

這裡也是通過定義自身的OnClickListener類,然後重寫其中的onClick方法,並在其中執行isLogined方法,該方法用於返回使用者是否登入的邏輯判斷,並且也是一個抽象的方法,所以也需要我們在業務層實現其具體的邏輯,然後我們重寫了其中的onLoginedClick方法和onNoLoginedClick方法,其中onLoginedClick方法為使用者登入之後的回撥方法,而onNoLoginedClick方法為使用者未登入之後執行的回撥方法。

定製化執行相應的業務邏輯

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

/**

* 執行定製化判斷邏輯的監聽類原始碼

*/

public abstract class OnClickCostomListener extends BaseClickListener {

@Override

public void onClick(View view) {

super.onClick(view);

if (isCorrect()) {

onCorrentClick(view);

} else {

onNoCorrentClick(view);

}

}

/**

* 判斷是否邏輯通過

* @return

*/

public abstract boolean isCorrect();

/**

* 判斷正確之後執行的邏輯請求

* @param v

*/

public abstract void onCorrentClick(View v);

/**

* 判斷失敗之後執行的邏輯請求

* @param v

*/

public abstract void onNoCorrentClick(View v);

}