web-dev-qa-db-fra.com

Comment centrer facilement l'indicateur de progression dans ProgressDialog (quand aucun titre/texte n'est transmis)

Lors de l'appel de progressDialog = ProgressDialog.show(this, null, null, true);, les développeurs souhaitent généralement afficher uniquement l'image d'indication de progression, et s'attendent généralement à ce qu'ils soient centrés dans la fenêtre (du moins du point de vue de la conception de l'interface utilisateur normale) . Mais l'image est trop éloignée, Il semble qu'un peu de remplissage/marge du côté droit est encore en cours de calcul dans le texte (facultatif) du côté droit, bien que nous ne transmettions aucun texte en tant que paramètre . Cela simplifierait simplement la vie du développeur: ) Il n’est donc pas nécessaire de créer un dialogue personnalisé uniquement pour que l’indicateur de progression soit centré par défaut.

(J'ai classé cette demande sous forme de demande de fonctionnalité sur http://code.google.com/p/Android/issues/detail?id=9697 ; veuillez l'indiquer si vous souhaitez également que cela soit amélioré).

Maintenant mes questions:

  1. Comment centrer facilement l'image de progression sans avoir à créer entièrement ma propre classe de dialogue d'alerte personnalisée? Un paramètre que j'ai peut-être oublié?

  2. En outre, comment définir l'arrière-plan sur transparent? 

Je me pose également des questions à ce sujet: https://stackoverflow.com/questions/2866141/how-to-put-custom-animation-into-a-progressdialog .__ Je n'ai pas encore essayé moi-même mais si vous ne pouvez pas créer d'animations personnalisées, cela signifie que si vous voulez une sorte d'indicateur de progression animé, vous devez toujours étendre la classe ProgressDialog? En regardant la classe ProgressDialog, je ne trouve rien d'autre bien que les tirages classiques ( ProgressDialog.Java ), ils n’utilisent pas AnimatedDrawable ici.

62
Mathias Conradt

J'ai fait quelques essais et j'estime que le meilleur moyen d'y parvenir est de personnaliser Dialog.

Voici un exemple de ce que j'ai fait. Cela répondra à la question 2 mais vous donnera une idée de la façon de résoudre la question 1.

public class MyProgressDialog extends Dialog {

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message) {
        return show(context, title, message, false);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate) {
        return show(context, title, message, indeterminate, false, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate, boolean cancelable) {
        return show(context, title, message, indeterminate, cancelable, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate,
            boolean cancelable, OnCancelListener cancelListener) {
        MyProgressDialog dialog = new MyProgressDialog(context);
        dialog.setTitle(title);
        dialog.setCancelable(cancelable);
        dialog.setOnCancelListener(cancelListener);
        /* The next line will add the ProgressBar to the dialog. */
        dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        dialog.show();

        return dialog;
    }

    public MyProgressDialog(Context context) {
        super(context, R.style.NewDialog);
    }
}

Toutes les méthodes statiques proviennent de this link, rien d’étrange, mais la magie opère dans le constructeur . Vérifiez que je passe en paramètre un style. Ce style est le suivant:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="NewDialog" parent="@Android:Theme.Dialog">
        <item name="Android:windowFrame">@null</item>
        <item name="Android:windowBackground">@Android:color/transparent</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowTitleStyle">@null</item>
        <item name="Android:windowAnimationStyle">@Android:style/Animation.Dialog</item>
        <item name="Android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="Android:backgroundDimEnabled">false</item>
        <item name="Android:background">@Android:color/transparent</item>
    </style>
</resources>

Il en résulte une ProgressBar rotation au centre de l'écran. Sans backgroundDim et sans la case Dialog.

104
Macarse

Manière facile et personnalisable:

Définir l'animation: (Res/drawable/loader_anim.xml)

<animated-rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:drawable="@drawable/image_for_rotation"
Android:pivotX="50%"
Android:pivotY="50%" />

ou:

<animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
Android:drawable="@drawable/img_loader_frame1"
Android:duration="150"/>
...
<item
Android:drawable="@drawable/img_loader_frame2"
Android:duration="150"/>
...
</animation-list>

puis, définissez la disposition: (res/layout/loader.xml)

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/layout_root"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:layout_gravity="center_vertical|center_horizontal"> 
<ProgressBar
Android:layout_width="200dp"
Android:layout_height="200dp"
Android:indeterminateDrawable="@drawable/loader_anim" />
</LinearLayout>

et ensuite, dialogue de progression d'instance:

ProgressDialog dialog;
...
dialog = ProgressDialog.show(this,null,null);
dialog.setContentView(R.layout.loader);
...
process();
...
dialog.dismiss();

Plus d'informations:

32
Hpsaturn

J'utilise ce qui suit, il ne nécessite aucun fichier de mise en page et place une barre de progression de blocage centrée et sans bordure au milieu de l'écran.

private ProgressDialog progressDialog;


setUIToWait(true);

...long process...

setUIToWait(false);


private void setUIToWait(boolean wait) {

    if (wait) {
        progressDialog=ProgressDialog.show(this,null,null);
        progressDialog.setContentView(new ProgressBar(this));
    } else {
        progressDialog.dismiss();
    }

}
24
egalot

Si vous souhaitez afficher uniquement une barre de progression indéterminée.

ProgressDialog progressDialog = ProgressDialog.show(this, null, null, true, false);
progressDialog.setContentView(R.layout.progress_layout);

Et créez un fichier XML de mise en page avec le nom "progress_layout.xml"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <ProgressBar
        Android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center" />

</LinearLayout>
19
Thafer Shahin

Il suffit de faire la méthode ci-dessous pour l'obtenir fait

Dans res-> valeurs-> styles, ajoutez le code ci-dessous

<style name="MyGravity" parent="Android:Theme.Material.Dialog" ></style>

Ensuite, créez votre ProgressDialog comme mentionné ci-dessous

ProgressDialog dialog = new ProgressDialog(ctx, R.style.MyGravity);
dialog.getWindow().setBackgroundDrawableResource(Android.R.color.transparent);
4
Arun Mohan
//create Dialog by using below method

@Override
protected Dialog onCreateDialog(int id) {

    switch (id) {

    case DIALOG1_KEY: {
        Dialog dialog = new Dialog(this,R.style.NewDialog);
        dialog.setContentView(R.layout.progress);
        dialog.setCancelable(true);
        return dialog;
    }
    }
    return null;
}

//then in your onCreate () you can call like below

@Override

public void onCreate(Bundle savedInstatncestate)

{

final Handler mHandler = new Handler();
showDialog(DIALOG1_KEY);
new Thread() {
public void run() {
try {
    sleep(3000);
    Runnable r = new Runnable() 
    {
    public void run() 
    {
               //do your background process

             dismissDialog(DIALOG1_KEY);
    }

        };
mHandler.post(r);
     } catch (Exception e) {
     }
   }
}.start();
}
2
Puthuumalar

Vous pouvez toujours ajouter une barre de progression dans toutes vos activités pour lesquelles vous souhaitez afficher ProgressDialog centré. Utilisez ce qui suit dans acitivity.xml en tant que: 

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

Dans votre activité.Java, utilisez 

ProgressBar bar = new Progress();
bar = (ProgressBar) findViewById(R.id.progressBar);

Désormais, lorsque vous souhaitez afficher la barre de progression, définissez sa visibilité sur visible et annulez la visibilité.

bar.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
0
Rathore