83 votes

Comment désactiver l'interaction utilisateur alors que ProgressBar est visible dans Android?

Je suis l'aide d'une ProgressBar personnalisé. Maintenant, tandis qu'une tâche est en cours, je suis en train de montrer la barre de progression, mais l'utilisateur peut toujours interagir avec les vues et les contrôles. Comment puis-je désactiver l'interaction de l'utilisateur sur l'ensemble de l'afficher comme un ProgressDialog ne , quand il est visible.

Ai-je besoin pour utiliser un affichage transparent sur le dessus de la vue principale et afficher la barre de progression sur que d'afficher et de masquer la vue une fois qu'une tâche est terminée.

Ou tout simplement obtenir l'id de mon parentView et ensemble il désactivé ? Mais alors je ne vais pas être en mesure d'éteindre l'arrière-plan, tout comme ce qui arrive quand une boîte de dialogue apparaît sur l'affichage/Activité/Fragment. Droit?

Je veux juste savoir le moyen de ne pas autoriser l'utilisateur à partir de n'importe quelle interaction, tandis que la barre de progression est visible.

Merci

157voto

Niyamat Ullah Points 917

Votre question: Comment faire pour désactiver l'interaction de l'utilisateur tandis que la Barre de progression est visible dans android?

Pour désactiver l'interaction de l'utilisateur vous suffit d'ajouter le code suivant

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Pour obtenir de l'interaction de l'utilisateur vous suffit d'ajouter le code suivant

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Voici un exemple: Note:je vous donne juste un exemple pour montrer comment désactiver ou de conserver l'interaction de l'utilisateur

Ajouter une barre de progression dans votre xml.Quelque chose comme ceci

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:visibility="gone"/>

Dans MainActivity quand un bouton pressé, vous pouvez afficher la barre de progression et de désactiver l'interaction de l'utilisateur.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView = (ImageView) findViewById(R.id.imageView);
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
    mImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mProgressBar.setVisibility(View.VISIBLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        }
    });
}

Et lorsque l'utilisateur backPressed vous supprimez le composant progressbar encore conserver l'interaction de l'utilisateur.Quelque chose comme ceci

  @Override
public void onBackPressed() {
    super.onBackPressed();
    mProgressBar.setVisibility(View.GONE);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}

Si vous souhaitez ajouter une fonctionnalité de désactiver et en grisé d'affichage, vous devez ajouter dans votre xml fichier de mise en page d'un linéaire de la mise en page qui remplit le parent. Définir ses arrière-plan à #B0000000 et sa visibilité à Disparu. Que programicly ensemble de sa visibilité Visible.

Espérons que cette aide!

14voto

Nirav Dangi Points 1655

J'ai résolu ce problème en ajoutant la disposition racine au ProgressBar .

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:clickable="true"
    android:gravity="center"
    android:visibility="gone"
    android:id="@+id/progress">
    <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:indeterminate="true"
        android:indeterminateTintMode="src_atop"
        android:indeterminateTint="@color/primary"/>
</LinearLayout>
 

Rendu la disposition racine cliquable

 android:clickable="true"
 

REMARQUE: Dans ma vue principale, j'avais RelativeLayout tant que root et j'ai ajouté le code mentionné ci-dessus dans la disposition racine à la dernière position (dernier enfant).

J'espère que cela t'aides!!

11voto

il suffit de régler:

 android:clickable="true" 
 

dans votre xml

 <ProgressBar...
 

Seulement cela fait de la magie!

3voto

Ramesh sambu Points 2204

Utiliser la méthode par défaut du document progressbar.setCancelable (false)

3voto

Qumber Abbas Points 26

Créez une boîte de dialogue avec un fond transparent. Le problème avec getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); est que lorsque l'application ira en arrière-plan et reviendra, l'utilisateur pourra interagir avec les composants de l'interface utilisateur, ce qui sera beaucoup plus maniable. Donc, pour bloquer l'interface utilisateur, créez une boîte de dialogue transparente et si vous souhaitez définir l'heure de masquage / affichage. Pour ce faire, dans un thread exécutable. La solution sera donc

 public class TransparentDialogHelper {

    private Dialog overlayDialog;

    @Inject
    public TransparentDialogHelper() {

    }

    public void showDialog(Context context) {
        if (AcmaUtility.isContextFinishing(context)) {
            return;
        }
        if (overlayDialog == null) {
            overlayDialog = new Dialog(context, android.R.style.Theme_Panel);
            overlayDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
        }
        overlayDialog.show();
    }

    public void hideDialog() {
        if (overlayDialog == null || AcmaUtility.isContextFinishing(overlayDialog.getContext())) {
            return;
        }
        overlayDialog.cancel();
    }
}

-------- Timer

Handler handler = new Handler();
handler.postDelayed( () -> {
    view.hideProgress();
}, 2000);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X