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
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!
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!!
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)
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);
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);