web-dev-qa-db-fra.com

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

J'utilise un ProgressBar personnalisé. Maintenant, pendant qu'une tâche est en cours, je montre la barre de progression, mais l'utilisateur peut toujours interagir avec les vues et les contrôles. Comment désactiver l’interaction de l’utilisateur sur l’ensemble de la vue, comme le fait un ProgressDialog, lorsqu’elle est visible.

Dois-je utiliser une vue transparente en haut de la vue principale, afficher la barre de progression sur cette vue et masquer cette vue une fois la tâche terminée? 

Ou juste obtenir l'id de mon parentView et le désactiver? Mais ensuite, je ne pourrai pas assombrir l'arrière-plan, comme ce qui se passe lorsqu'un dialogue apparaît dans la vue/Activité/Fragment. Droite? 

Je veux juste savoir comment interdire à l'utilisateur toute interaction tant que la barre de progression est visible.

Merci

31
intellignt_idiot

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

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

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

Pour récupérer l'interaction de l'utilisateur, il vous suffit d'ajouter le code suivant.

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

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

Ajoutez une barre de progression dans votre fichier xml.

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

Dans MainActivity, lorsque vous appuyez sur un bouton, vous affichez la barre de progression et désactivez 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 appuie en arrière sur la barre de progression, vous supprimez à nouveau la barre de progression et conservez ainsi son interaction.

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

Si vous souhaitez ajouter une fonctionnalité d'affichage désactivé et grisé, vous devez ajouter dans votre fichier de présentation XML une présentation linéaire qui remplit le parent. Définissez son arrière-plan sur # B0000000 et sa visibilty sur GONE. Puis définissez par programme sa visibility à VISIBLE.

J'espère que cette aide!

81
Niyamat Ullah

J'ai résolu ce problème en ajoutant une mise en page racine à la 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>

Rendre la disposition racine cliquable

Android:clickable="true"

REMARQUE: Dans ma vue principale, j'avais RelativeLayout en tant que racine et j'avais ajouté le code susmentionné à l'intérieur de la présentation racine à la dernière position (dernier enfant).

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

4
Nirav Dangi

viens de définir:

Android:clickable="true" 

dans votre xml 

<ProgressBar...

Seulement cela fait de la magie!

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

2
Ramesh sambu

Faire un 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 passe en arrière-plan et revient, l'utilisateur sera en mesure d'interagir avec les composants de l'interface utilisateur, beaucoup plus de manipulations. Donc, pour bloquer l'interface utilisateur, créez une boîte de dialogue transparente et indiquez si vous souhaitez définir l'heure de masquage/affichage. Faites cela dans un thread exécutable. Donc, la solution sera

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);
1
Qumber Abbas

Faites votre mise en page parent en tant que mise en page relative et ajoutez ceci: 

    <RelativeLayout ... >

    <other layout elements over which prog bar will appear>

<RelativeLayout Android:id="@+id/rl_progress_bar"
                Android:layout_width="match_parent" Android:clickable="true"
                Android:layout_height="match_parent" >
<ProgressBar Android:id="@+id/pb"
             Android:layout_width="wrap_content"
             Android:layout_height="wrap_content"
             Android:layout_centerInParent="true"
             Android:indeterminateOnly="true"
             style="@Android:style/Widget.DeviceDefault.ProgressBar"
             Android:theme="@style/AppTheme.MyProgressBar"
    />
</RelativeLayout>

Si vous avez des boutons flottants dans votre interface utilisateur, ils capturent tout le focus et restent cliquables lorsque la barre de progression est visible. pour cette utilisation: (lorsque votre barre de prog est visible et réactivez-les lorsque vous la rendez invisible/disparue)

fb.setEnabled(false);
1
AndroidGuy