태그 보관물: button

button

버튼을 누를 때 활동이 두 번로드되는 것을 방지하는 방법 누르면 활동이

첫 번째 클릭 후 즉시 버튼을 두 번 누르면 활동이 두 번로드되는 것을 방지하려고합니다.

버튼 클릭시로드되는 활동이 있습니다.

 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) :

  1. 활동을 시작하는 버튼 비활성화 : 작동하지만 약간 서투른 느낌입니다. 앱에서 활동을 시작하는 여러 방법이있는 경우 (예 : 작업 표시 줄의 버튼 및 목록보기에서 항목 클릭) 여러 GUI 요소의 활성화 / 비활성화 상태를 추적해야합니다. 예를 들어 목록보기에서 클릭 한 항목을 비활성화하는 것은 그리 편리하지 않습니다. 따라서 매우 보편적 인 접근 방식은 아닙니다.
  2. launchMode = “singleInstance”: startActivityForResult ()에서 작동하지 않고 startActivity ()를 사용하여 뒤로 탐색을 중단합니다. Android 매니페스트 문서에서 일반 애플리케이션에 권장하지 않습니다.
  3. launchMode = “singleTask”: startActivityForResult ()에서 작동하지 않습니다. Android 매니페스트 문서의 일반 애플리케이션에는 권장되지 않습니다.
  4. FLAG_ACTIVITY_REORDER_TO_FRONT : 뒤로 버튼을 끊습니다.
  5. FLAG_ACTIVITY_SINGLE_TOP : 작동하지 않고 활동이 여전히 두 번 열립니다.
  6. 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로 설정하면 동일한 리스너를 사용하는 다른 버튼이 계속 활성화됩니다. 따라서 리스너의 액션이 두 번 호출되지 않도록하려면 리스너의 모든 호출을 비활성화하는 전역적인 것이 있어야합니다 (새 인스턴스인지 여부는 신경 쓰지 마십시오).

내 답변과 다른 답변의 차이점은 무엇입니까?

그들은 올바른 방식으로 생각하고 있지만 향후 호출 활동의 동일한 인스턴스로 돌아갈 생각은 없습니다. 🙂