안드로이드 개발 버튼 연속 클릭 방지

7729 단어
안드로이드 개발 버튼 연속 클릭 방지
전언
버튼을 누르면 연속 클릭을 방지하는 것은 어떤 항목이든 고려해야 할 기능이다.다음은 몇 가지 버튼의 연속 클릭을 방지하는 방법을 소개할 것이다
 
도구 클래스로 구현
/**
 *@content:       ,        
 *@time:2019-5-19
 *@build:
 */

public class ButtonDelayUtil {

    private static final int MIN_CLICK_DELAY_TIME = 1000;
    private static long lastClickTime;

    public static boolean isFastClick(){
        boolean flag = false;
        long curClickTime = System.currentTimeMillis();
        if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
            flag = true;
        }
        lastClickTime = curClickTime;
        return flag;
    }

}

사용
mAdapter.setItemClickListener(new PTempEventListAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(PTempEventListBase.TempEventData tempEventData) {
                if (ButtonDelayUtil.isFastClick()){
                    Intent intent = new Intent(PTempEventListActivity.this, PTempEventDetailActivity.class);
                    intent.putExtra(PTempEventDetailActivity.APPLY_ID_KEY, tempEventData.getApplyId());
                    startActivity(intent);
                }
            }
        });

간단하지만 사용할 때도 귀찮아요.코드를 매우 간결하지 못하게 할 수도 있어 보충 방법으로 쓸 수 있다.
 
다시 쓰기 클릭 OnClickListener 클래스 구현
public abstract class OnForbidClickListener implements View.OnClickListener {
    private static final long DELAYED_TIME = 1000;
    private long lastTime = 0;

    public abstract void forbidClick(View view);

    @Override
    public void onClick(View v) {
        if (System.currentTimeMillis()-lastTime > DELAYED_TIME){
            lastTime = System.currentTimeMillis();
            forbidClick(v);
        }
    }
}

사용
mFaceInfoText.setOnClickListener(new OnForbidClickListener() {
            @Override
            public void forbidClick(View view) {
                Intent startFaceHome = new Intent(PParentInfoActivity.this, FaceHomeActivity.class);
                startFaceHome.putExtra(FaceHomeActivity.FACE_USER_ID_KEY, mParentId);
                startFaceHome.putExtra(FaceHomeActivity.FACE_IDENTITY_TYPE_KEY, 2);
                startFaceHome.putExtra(FaceHomeActivity.FACE_SCHOOL_ID_KEY, PSPDataSession.I().getCurrentChildData().getSchoolId());
                startActivity(startFaceHome);
            }
        });

사실 위의 도구 클래스와 유사하지만 실현 방식을 다시 쓰는 클릭 인터페이스 클래스에 넣는 것도 번거롭지만 적어도 코드는 간결하다
 
전역 부울 값 연속 클릭 방지
사실 위의 두 가지 방식은 여전히 연결될 수 있다. 예를 들어 클릭한 후에 인터넷 요청을 보낼 수 있다. 요청이 완료된 후에finish Activity가 대기 대화상자를 추가해도 대기 대화상자가 닫히면 activity가 닫히려고 할 때 제출 버튼을 계속 누르면 두 번째 인터넷 요청을 촉발할 수 있다.
그래서 아래의 방식은 비교적 번거롭지만, 기능이 연결되는 것을 방지하는 것이 가장 좋은 방법이다.그래서 보통 인터넷 요청에 사용됩니다.
private boolean mPostAddApiing = false;

인터페이스를 요청할 때
mSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(mEditPhoneNumber.getText()) || mEditPhoneNumber.getText().toString().length() < 11) {
                    Toast.makeText(PParentAddActivity.this, "          ", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (mEditVerificationCode.getText().toString().length() < 6) {
                    Toast.makeText(PParentAddActivity.this, "         ", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (!mPostAddApiing){
                    mPostAddApiing = true;
                    postAddApi();
                }

            }
        });

그리고 인터페이스 리셋에서 성공하면 mPostAddApiing을 처리하지 않고finish activity를 직접 닫습니다. 만약activity가 닫기/제출 실패/네트워크 이상/사용자가 자발적으로 요청을 취소하지 않아도 mPostAddApiing=false를 조작하여 버튼 복구를 클릭할 수 있도록 합니다.
물론 아래의 방식과 같이 효과를 얻을 수 있다. 스위치를 원하는 곳에서 클릭을 처리하기만 하면 논리적으로 비교적 은밀하다.
mSubmit.setClickable(false);

 
posted on
2019-05-22 14:48 관심정독(
...) 설명(
...) 모음 편집
전재 대상:https://www.cnblogs.com/guanxinjing/p/10905850.html

좋은 웹페이지 즐겨찾기