마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

activity 중복 방지

0 추천
안녕하세요

요즘 한창 개발에 빠진 청년입니다.

activity 중복가 중복으로 뜨는 현상을 몇일째 해결하지 못하고 있어서 살며시 질문 하나 드립니다 ㅠㅠ

1. 현상

현재 TextView를 누르면 intent로 activity를 하나 호출합니다. 그리고 이 activity에서 값을 다 입력 후 완료를 누르면

다음 TextView를 자동으로 클릭하여 다음 activity를 호출합니다. 이때 자동으로 클릭은 performClick()을 사용하여 호출합니다.

근대 이때 문제가 있습니다. performClick를 실행할 때 사용자가 재빠르게 TextView를 클릭하면 Activity 창이 두개가 떠버립니다.

2. 시도해본 방법들

이 현상을 막기위해 여러가지 시도해봤습니다. 방법은 시간을 이용한 방법과 SignleTop / SigleInsance 설정 두 가지 방법을 시도 해봤지만, 첫 번째는 너무 최후의 수단인거 같고 두 번째 방법은 결과는 onActivityResult()로 결과를 정상적으로 받아오지 못했습니다.

Activity가 중복으로 뜨게 하지 못하기 위해서는 싱글톤 패턴을 써서 구현하면 될까요? 원인을 모르겠네요 ㅠㅠ

더블 클릭 방지 노하우 좀 있으면 알려주세요 !!
parknice (120 포인트) 님이 2014년 5월 27일 질문

3개의 답변

0 추천
이곳에서도 많이 나왔던 글이구요

몇가지 방법이 존재 합니다.

clickable 을 변경하는것과 handler 를 이용하는 식인 것이죠

이런 저런 내용이 많으니 검색해보세요

http://stackoverflow.com/questions/16662777/how-to-resolve-double-tap-on-button-issue-in-android
aucd29 (218,390 포인트) 님이 2014년 5월 27일 답변
이 방법도 사용해봤는데 깜빡했네요..결과는 역시 안되네요 ..아주 교묘한 타이밍에  activity가 같이 올라오네요 ㅠㅠ
0 추천
boolean형 변수 하나 만드세요.

 

혹은 activity 실행할때 Flag(FLAG_ACTIVITY_SINGLE_TOP)를 두세요.
마피 (2,970 포인트) 님이 2014년 5월 27일 답변
FLAG_ACTIVITY_SINGLE_TOP 또 써봤지만, onActivityResult() 에서 이상하게 결과를 받지 못하네요 ㅠㅠ
0 추천
방법은 여러가지 있을거같은데요..

단순히 performClick이 실행됐을때 textview.enable(false)로 클릭을 못하게막아도될거같고..

static boolean 변수하나두고 performClick이 실행되면 boolean을 바꿔서 다음 클릭시엔 리턴을 걸어버려도되고..

 

정확히 상황이 이해가안가는데,

A Activity에서 텍스트뷰를 누르면 B Activity가 뜨고 완료를 누르면 B Activity가 꺼지고 A Activity에서 performClick을 수행해서 C Activity를 띄운다는 말씀이신가요?

정확히 플로우를 올려주심 이해가빠를듯한데,

이 플로우를 수정하는게 낫지않을까 싶기는하네요. A -> B -> A -> C 가 아니라 A -> B -> C로 가도될듯하고.

꼭 startActivityForResult같이 A->B->A로 와야한다면 그냥 B에서 C로넘어갈때 A 에 스태틱변수나 메서드를 둬서 직접 수행시키고 C로 넘어간다던지..
기초개발자 (24,060 포인트) 님이 2014년 5월 27일 답변
답변이 너무 늦어졌네요. 아직 현상을 해결하지 못했습니다. static boolean 변수를 선언하여 체크하였지만 아주 확률만 낮아졌지 근본적으로 해결 하지 못하였습니다.
현재 플로우는 A -> B -> A ->B 이런식입니다. A에서 B를 호출하고 결과를 받아와서 다시 A로 와서 B를 또 호출합니다. A에서 B를 호출 할 때  이때startActivityForResult 결과에서 A로 돌아오면서 TextView를 performClick 함수로 클릭하여 다시 B를 호출하는겁니다.

아래는 onActivityResult() 소스입니다.
mTextViewA.setText(data.getStringExtra(TEXT1);
String test = data.getByteArrayExtra(TEXT2) ;
mTextViewB.performClick();

혹시나 궁금한 점 있으시면 답변 좀 부탁드립니다 ^^
좋은 하루 되세요
...