1

Je sais qu'il y a beaucoup de mêmes questions MAIS je n'ai pas trouvé de solution pour Android Oreo (8.0, API 26).Comment empêcher le démarrage de l'activité duplicable sur dobleTap dans Android Oreo

Quel est mon problème:

Lorsque je tape plusieurs fois sur le bouton qui envoie l'intention de commencer activityForResult, l'activité commence fois plus!

choses étranges:

  1. Classic 'startActivity (intention)' ne pas faire ce "problème" = l'activité commence une seule fois

  2. Il ne se produit que sur l'appareil/émulateur avec Android Oreo (les versions antérieures fonctionne très bien)

Exemple Code:

Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="sandbox.jarda.cz.activityresulttest"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity 
      android:name=".SecondActivity" 
      android:launchMode="singleTop" /> 

    </application> 

</manifest> 

exemple de code Java:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ((Button) findViewById(R.id.startButton)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getApplicationContext(), SecondActivity.class); 

       // starts Activity more times on double tap 
       startActivityForResult(intent, 0); 

       //works fine BUT I WANT RESULT 
       startActivity(intent); 
      } 
     }); 
    } 
} 

Répondre

1

Essayez de désactiver l'affichage et permettent une fois l'activité est lancée

@Override 
public void onClick(View view) { 
    view.setEnabled(false); 
    Intent intent = new Intent(getApplicationContext(), SecondActivity.class); 

    // starts Activity more times on double tap 
    startActivityForResult(intent, 0); 

    //enable button 
    view.setEnabled(true); 

    //OR enable button after half second etc 
    new Handler().postDelayed(new Runnable() { 
     view.setEnabled(true); 
    }, 500); 

} 

Aussi, vous pouvez garder désactivé jusqu'à ce que vous reveniez d'une autre activité. Activer le bouton dans onActivityResult de MainActivity

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    //enable button here 
} 
+0

Thx l'activation retardée a aidé. Savez-vous pourquoi est-ce nécessaire dans le nouveau Android? :) – Jarda

+0

Oui, s'il vous plaît lire la section de l'accessibilité sur https://developer.android.com/about/versions/oreo/android-8.0-changes.html – Pehlaj

+0

et probablement une question factice ...: D pourquoi ça fonctionnait bien avec startActivity (intention); : D – Jarda

1

Vous pouvez désactiver le bouton une fois que vous avez cliqué dessus comme ci-dessous.

Button.setEnabled(false); 

Vous pouvez réécrire le code comme ci-dessous

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ((Button) findViewById(R.id.startButton)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
     ((Button) findViewById(R.id.startButton)).setEnabled(false); 
       Intent intent = new Intent(getApplicationContext(), SecondActivity.class); 

       // starts Activity more times on double tap 
       startActivityForResult(intent, 0); 

       //works fine BUT I WANT RESULT 
       startActivity(intent); 
      } 
     }); 
    } 
} 
1

Vous pouvez désactiver ce bouton pour quelques millisecondes en utilisant ce.

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ((Button) findViewById(R.id.startButton)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      view.setEnabled(false); 
      view.postDelayed(() -> view.setEnabled(true),200); 
      Intent intent = new Intent(getApplicationContext(), SecondActivity.class); 

      // starts Activity more times on double tap 
      startActivityForResult(intent, 0); 

      //works fine BUT I WANT RESULT 
      startActivity(intent); 
     } 
    }); 
} 
}