Boîte de dialogue de l'arrière et de progression de l'Android

J'ai un AsyncTask qui montre un ProgressDialog pendant le travail (il appelle runOnUiThread à partir de doInBackground pour afficher la boîte de dialogue de progression).

Pendant son fonctionnement, je souhaite autoriser l'utilisation du bouton arrière pour annuler l'opération; Quelqu'un d'autre a eu ce problème: le bouton BACK ne fonctionne pas, pendant que ProgressDialog est en cours d'exécution

  • Android GCM avec des saveurs de produits
  • AVD ne démarre pas (SDK Tools 22.6.2)
  • Pince de visionneuse PDF.js pour zoomer
  • Lorsque vous utilisez le CoordinatorLayout, mon ScrollView a une taille incorrecte
  • Android Column GridView, largeur variable comme GooglePlus App
  • ProgressDialog - comment supprimer les nombres
  • Pour quelle raison, je ne peux pas répondre à ce fil, donc avoir à démarrer un autre? (Une autre question pour un autre jour)

    J'ai eu la même idée que Sandy, mais ce code n'est jamais appelé alors que ProgressDialog est en train de montrer, pourquoi? Je l'ai implémenté dans ma classe d'activité principale, le ProgressDialog prend-il temporairement l'avant-plan de ma classe?

  • Comment définir l'arrière-plan du bouton sélectionné / non sélectionné dans le fichier XML
  • Différence entre Phonegap et Sencha Touch
  • Gestion de la mémoire de l'interface sans fin Android
  • Comment obtenir une liste d'applications Android installées et choisir une à exécuter
  • Twitter Bootstrap Dropdowns Unclickable On Tablets
  • Animation de mosaïque Google Plus
  • 9 Solutions collect form web for “Boîte de dialogue de l'arrière et de progression de l'Android”

    Tout d'abord, vous devez afficher votre boîte de dialogue OnPreExecute , la cacher dans OnPostExecute et, le cas échéant, la modifier en publiant des progrès. (Voir ici )

    Maintenant à votre question: ProgressDialog.show() peut prendre un OnCancelListener comme argument. Vous devriez fournir un qui appelle cancel() sur l'instance de dialogue de progression.

    Exemple:

      @Override protected void onPreExecute(){ _progressDialog = ProgressDialog.show( YourActivity.this, "Title", "Message", true, true, new DialogInterface.OnCancelListener(){ @Override public void onCancel(DialogInterface dialog) { YourTask.this.cancel(true); finish(); } } ); } 

    _progressDialog est un membre ProgressDialog de YourTask .

    Eh bien, j'ai eu le même problème. La méthode la plus simple qui a fonctionné pour moi est d'utiliser progressDialog.setCancelable(true) . Cela déclare si la boîte de dialogue est annulable en appuyant sur la touche arrière. Essayez-le et faites-moi savoir si cela fonctionne pour vous ou non. Bonne chance

    Cela peut être obtenu par le fragment de code suivant:

     progress.setCancelable(true); progress.setCanceledOnTouchOutside(false); 

    La progression est l'objet ProgressDialog …

    Cela permettra au bouton arrière de fermer la boîte de dialogue mais empêche toute entrée tactile de le faire …

    Je viens de trouver une solution parfaite et plus simple à ce problème. Il existe une méthode dans ProgressDialog pour définir KeyListener.

     progressDialog.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK && !event.isCanceled()) { if(progressDialog.isShowing()) { //your logic here for back button pressed event } return true; } return false; } }); 

    Il fonctionne bien avec setCancelable(false) . Je vérifie également pour event.isCanceled() , car sans ça, j'avais deux événements. J'ai testé ceci sur le périphérique Lollipop avec et sans clés Hardware.

    Traiter le bouton arrière comme une annulation n'est pas la bonne façon.
    L'annulation se produit également lorsqu'un utilisateur touche l'écran en dehors de la boîte de dialogue. Vous voulez différencier ces deux actions, non?

    L'approche correcte serait d'étendre la classe ProgressDialog et de remplacer la méthode onBackPressed.

     private class SubProgressDialog extends ProgressDialog { public SubProgressDialog(Context context) { super(context); } @Override public void onBackPressed() { /** dismiss the progress bar and clean up here **/ } } public void displayProgressBar(){ progressBar = new SubProgressDialog(this); progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressBar.setCancelable(false); progressBar.setMessage(getString(R.string.authorizing)); progressBar.show(); new Thread(new Runnable() { public void run() { } }).start(); 

    }

    Notez le setCancelable (faux), soulignant à nouveau que le bouton arrière est différent d'une simple annulation.
    De plus, cela va effectivement ignorer toute autre entrée tactile de l'utilisateur.

    Voici ma solution à cela. Le problème de PD se produit uniquement lorsque l'application sort sur le bouton arrière (Habituellement, lorsque l'utilisateur l'appuie de façon répétitive, et seulement parfois (pas toutes les fois), la PD est appelée lorsque l'application a déjà été détruit. Rejeter la PD onDestroy ne fonctionne pas pour certains Et quand je l'ai essayé, chaque bouton de bouton arrière ferme l'application bien que canGoBack() soit défini sur true. Au lieu de cela, je goBack le PD sur goBack qui est l'événement qui cause la collision en premier lieu, et je le fais Juste avant la finish() . Si l'application sort sur goBack normalement, il n'y a pas de problème en premier lieu.

    BTW, la «différence» vise à permettre à l'utilisateur de quitter l'application avec un double clic rapide (400 MS entre deux clics) au lieu de revenir d'une page à l'autre.

    J'espère que ça aide quelqu'un …

     @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: difference = System.currentTimeMillis() - startTime; if (wView.canGoBack() && difference > 400) { wView.goBack(); } else { dismissProgressDialog(); finish(); } startTime = System.currentTimeMillis(); return true; } } return super.onKeyDown(keyCode, event); } private void dismissProgressDialog() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } } 

    Javano … J'ai testé votre scénario en utilisant des techniques standard, asyncTask et ProgressDialog. Dans mon test, lorsque ProgressDialog est en train de s'afficher et que je retarde, le descriptif de progression est rejeté et le thread d'arrière-plan continue de s'exécuter. Je ne sais pas pourquoi vous devez appeler runOnUiThread.

    ALORS:

    Affiche la progressionDialog dans onPreExecute place la tâche longue dans doInBackground ignore le ProgressDialog dans onPostExecute passe les paramètres d'entrée dans ta longue tâche, comme dans:

     new MyAsynch().execute(password,inString); 

    Annuler () l'asynchTask et progressDialog dans onPause

     protected void onPause() { super.onPause(); if (asynch != null) {asynch.cancel(true);} if (progress != null){progress.cancel();} } 

    JAL

    J'ai un code ici .

    C'est très simple, il suffit de copier le code ci-dessous et de le coller dans la tâche Async.

    Dialogue ProgressDialog;

     @Override protected void onPreExecute() { dialog = new ProgressDialog(MainActivity.this) { @Override public void onBackPressed() { dialog.cancel(); dialog.dismiss(); } }; // dialog.setTitle("file is..");//its optional If u want set title in progress // bar dialog.setMessage("Loading file...."); dialog.setCancelable(false); dialog.show(); } 

    S'il vous plaît, suivez le bouton d'annulation, puis cliquez sur le bouton Annuler.

     protected void onPreExecute() { dialogx.setMessage("Loading... Please Wait..."); dialogx.setCancelable(false); dialogx.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialogx.dismiss(); GetDataTask.this.cancel(true); finish(); } }); dialogx.show(); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.