첫 번째 클릭 후 즉시 버튼을 두 번 누르면 활동이 두 번로드되는 것을 방지하려고합니다.
버튼 클릭시로드되는 활동이 있습니다.
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//Load another activity
}
});
이제로드 할 활동에 네트워크 호출이 있기 때문에로드하는 데 약간의 시간이 걸립니다 (MVC). 이에 대한 로딩 뷰를 보여 주지만 그 전에 버튼을 두 번 누르면 액티비티가 두 번로드되는 것을 볼 수 있습니다.
아무도 이것을 방지하는 방법을 알고 있습니까?
답변
버튼의 이벤트 리스너에서 버튼을 비활성화하고 다른 활동을 표시합니다.
Button b = (Button) view;
b.setEnabled(false);
Intent i = new Intent(this, AnotherActitivty.class);
startActivity(i);
onResume()
버튼을 다시 활성화하려면 재정의 합니다.
@Override
protected void onResume() {
super.onResume();
Button button1 = (Button) findViewById(R.id.button1);
button1.setEnabled(true);
}
답변
이것을 Activity
정의에 추가하십시오 AndroidManifest.xml
…
android:launchMode = "singleTop"
예를 들면 :
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode = "singleTop"/>
답변
이와 같은 인 텐트 플래그를 사용할 수 있습니다.
Intent intent = new Intent(Class.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
activity.startActivity(intent);
기록 스택의 맨 위에 하나의 활동 만 열리게됩니다.
답변
SO는 다른 답변에 대한 댓글을 허용하지 않기 때문에이 스레드를 새로운 답변으로 오염시켜야합니다.
‘활동이 두 번 열립니다’문제에 대한 일반적인 답변과이 솔루션에 대한 내 경험 (Android 7.1.1) :
- 활동을 시작하는 버튼 비활성화 : 작동하지만 약간 서투른 느낌입니다. 앱에서 활동을 시작하는 여러 방법이있는 경우 (예 : 작업 표시 줄의 버튼 및 목록보기에서 항목 클릭) 여러 GUI 요소의 활성화 / 비활성화 상태를 추적해야합니다. 예를 들어 목록보기에서 클릭 한 항목을 비활성화하는 것은 그리 편리하지 않습니다. 따라서 매우 보편적 인 접근 방식은 아닙니다.
- launchMode = “singleInstance”: startActivityForResult ()에서 작동하지 않고 startActivity ()를 사용하여 뒤로 탐색을 중단합니다. Android 매니페스트 문서에서 일반 애플리케이션에 권장하지 않습니다.
- launchMode = “singleTask”: startActivityForResult ()에서 작동하지 않습니다. Android 매니페스트 문서의 일반 애플리케이션에는 권장되지 않습니다.
- FLAG_ACTIVITY_REORDER_TO_FRONT : 뒤로 버튼을 끊습니다.
- FLAG_ACTIVITY_SINGLE_TOP : 작동하지 않고 활동이 여전히 두 번 열립니다.
- FLAG_ACTIVITY_CLEAR_TOP : 이것은 나를 위해 일하는 유일한 사람입니다.
편집 : 이것은 startActivity ()로 활동을 시작하기위한 것입니다. startActivityForResult ()를 사용할 때 FLAG_ACTIVITY_SINGLE_TOP 및 FLAG_ACTIVITY_CLEAR_TOP를 모두 설정해야합니다.
답변
나를 위해 일했을 때만 startActivity(intent)
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
답변
두 번 호출하는 활동을 피하려면 singleInstance를 사용하십시오.
<activity
android:name=".MainActivity"
android:label="@string/activity"
android:launchMode = "singleInstance" />
답변
@wannik이 옳다고 가정 해 보겠습니다.하지만 동일한 액션 리스너를 호출하는 버튼이 2 개 이상이고 다음 활동을 시작하기 전에 거의 동시에 두 개의 버튼을 클릭하면 …
따라서 필드 private boolean mIsClicked = false;
와 리스너 가 있으면 좋습니다 .
if(!mIsClicked)
{
mIsClicked = true;
Intent i = new Intent(this, AnotherActitivty.class);
startActivity(i);
}
그리고 onResume()
상태를 반환해야합니다.
@Override
protected void onResume() {
super.onResume();
mIsClicked = false;
}
내 대답과 @wannik의 대답의 차이점은 무엇입니까?
뷰를 호출하는 리스너에서 enabled를 false로 설정하면 동일한 리스너를 사용하는 다른 버튼이 계속 활성화됩니다. 따라서 리스너의 액션이 두 번 호출되지 않도록하려면 리스너의 모든 호출을 비활성화하는 전역적인 것이 있어야합니다 (새 인스턴스인지 여부는 신경 쓰지 마십시오).
내 답변과 다른 답변의 차이점은 무엇입니까?
그들은 올바른 방식으로 생각하고 있지만 향후 호출 활동의 동일한 인스턴스로 돌아갈 생각은 없습니다. 🙂