1
votes

Comment afficher ProgressBar au centre de l'écran, quels que soient les types de disposition

Je me demande s'il existe un moyen d'afficher une ProgressBar au milieu de l'écran par programme quel que soit le type de mise en page de l'activité en cours, comme un toast peut être affiché comme,

Toast toast = Toast.makeText(Activity.this,"Sample toast", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();


6 commentaires

Il y a une différence que Toast dessine sur Window et ne fait pas partie de votre mise en page. Si ProgressBar fait partie d'une mise en page, vous devez définir des règles pour le centrer. Si vous voulez l'afficher en superposition, vous pouvez utiliser une boîte de dialogue qui s'affichera automatiquement au centre ,


Une des options sera d'afficher la barre de progression dans une boîte de dialogue


Mais ProgessDialog est obsolète dans les derniers Androids @ADM


@ManoharReddy comment pouvons-nous faire ça? Il serait utile de décrire votre idée en réponse avec un exemple de code. Merci..


Je n'ai rien dit sur la boîte de dialogue de progression. J'ai dit utiliser une boîte de dialogue.


@ADM désolé pour le malentendu, mais comment pouvons-nous montrer les progrès avec un dialogue?


4 Réponses :


0
votes
public static void showProgressDialog(Context context) {
    if (mDialog != null && mDialog.isShowing()) {
        mDialog.dismiss();
        mDialog = null;
    }

    try {
        mDialog = new ProgressDialog(context, R.style.MyAlertDialogStyle);
        mDialog.show();
        mDialog.setCancelable(false);
        if (mDialog.getWindow() != null)
            mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        mDialog.setContentView(R.layout.progress_layout);
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();

        layoutParams.copyFrom(mDialog.getWindow().getAttributes());

        int dialogWindowWidth = Validator.DtP(200,context);
        int dialogWindowHeight = Validator.DtP(150,context);

        layoutParams.width = dialogWindowWidth;
        layoutParams.height = dialogWindowHeight;

        // Apply the newly created layout parameters to the alert dialog window
        mDialog.getWindow().setAttributes(layoutParams);
    } catch (Exception e) {
        e.printStackTrace();
    }

    // dialog.setMessage(Message);

}

public static void hideProgressDialog(Context context) {
    ((Activity)context).runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (mDialog != null && mDialog.isShowing()) {
                mDialog.dismiss();
            }
        }
    });

}

 public static int DtP(float dp, Context context) {
        return (int) (dp * (context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT));
    }

1 commentaires

mDialog.setContentView (R.layout.progress_layout) . quel est le contenu de la progress_layout . Je veux le montrer par programme. Je suis tenu de n'utiliser aucune mise en page.



0
votes

Comme ProgressDialog est obsolète, vous pouvez utiliser Dialog (qui apparaît par défaut au centre de l'écran) pour afficher la barre de progression au centre.

layout_loading_progress_bar.xml:

public void showProgress(Context context, String message, boolean cancelable) {
    mDialog = new Dialog(context);
    mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    mDialog.setContentView(R.layout.layout_loading_progress_bar);
    WindowManager.LayoutParams params = mDialog.getWindow().getAttributes();
    params.width = ViewGroup.LayoutParams.MATCH_PARENT;
    mDialog.getWindow().setAttributes(params);
    ProgressBar mProgressBar = mDialog.findViewById(R.id.progress_bar);
    TextView progressText = mDialog.findViewById(R.id.progress_text);
    progressText.setText(message);
    progressText.setVisibility(View.VISIBLE);
    mProgressBar.setVisibility(View.VISIBLE);
    mProgressBar.setIndeterminate(true);
    mDialog.setCancelable(cancelable);
    mDialog.setCanceledOnTouchOutside(cancelable);
    mDialog.show();
}

public void hideProgress() {
    if (mDialog != null) {
        mDialog.dismiss();
        mDialog = null;
    }
}

LoadingProgressBar.java

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="85dp">

<ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/progress_text"
    android:layout_margin="@dimen/dimen_10dp"
    android:theme="@style/AppTheme.WhiteAccent" />

<TextView
    android:id="@+id/progress_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="@dimen/dimen_10dp"
    android:text="Loading..."
    android:textColor="@color/textYellow"
    android:textSize="17sp" />


3 commentaires

Est-il possible de créer la barre de progression par programmation?


Oui, vous pouvez également le créer par programme et l'ajouter dans n'importe quelle mise en page.


pourriez-vous s'il vous plaît modifier votre réponse pour ajouter une barre de progression par programme?



2
votes

Voici ce que j'utilise, je prends l'icône de l'application et la fais pivoter au milieu de l'écran pour l'afficher au fur et à mesure de la progression, cela a l'air mieux que de simplement afficher la barre de progression. Si vous voulez toujours la barre de progression, remplacez simplement ImageView par ProgressBar

private var dialog: Dialog? = null

fun showProgress(context: Context?): Dialog? {
    if (context is Activity && (dialog == null || !dialog!!.isShowing)) {
        try {
            dialog = MyProgressDialog(context)
            dialog?.show()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    return dialog
}

fun dismissProgress() {
    try {
        if (dialog != null && dialog!!.isShowing) {
            dialog?.dismiss()
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    dialog = null
}

Pour afficher et masquer la progression, j'utilise ces méthodes

import android.animation.ObjectAnimator
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.Gravity
import android.view.ViewGroup
import android.view.Window
import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView

class MyProgressDialog : Dialog {
    private var dialog: Dialog? = null
    var imageView: ImageView? = null
        internal set
    internal var textView: TextView? = null


    constructor(context: Context) : super(context) {
        init(context)
    }

    constructor(context: Context, themeResId: Int) : super(context, themeResId) {
        init(context)
    }

    protected constructor(context: Context, cancelable: Boolean, cancelListener: DialogInterface.OnCancelListener?) : super(context, cancelable, cancelListener) {
        init(context)
    }


    fun init(context: Context) {

        dialog = this

        dialog!!.window!!.requestFeature(Window.FEATURE_NO_TITLE)
        dialog!!.setCancelable(false)


        val relativeLayout = RelativeLayout(context)
        val layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
        relativeLayout.layoutParams = layoutParams


        val layoutParams_for_linear = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
        layoutParams_for_linear.addRule(RelativeLayout.CENTER_IN_PARENT)
        val linearLayout = LinearLayout(context)
        linearLayout.layoutParams = layoutParams_for_linear
        linearLayout.orientation = LinearLayout.VERTICAL

        relativeLayout.addView(linearLayout)


        val layoutParams_Linear = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
        layoutParams_Linear.gravity = Gravity.CENTER


        imageView = ImageView(context)
        imageView!!.setImageResource(R.mipmap.ic_launcher)
        imageView!!.layoutParams = layoutParams_Linear

        linearLayout.addView(imageView)

        textView = TextView(context)
        textView!!.layoutParams = layoutParams_for_linear
        textView!!.setTextColor(Color.parseColor("#ffffff"))
        textView!!.textSize = 18f
        linearLayout.addView(textView)


        val animation = ObjectAnimator.ofFloat(imageView, "rotationY", 0.0f, 360f)
        animation.duration = 2500
        animation.repeatCount = ObjectAnimator.INFINITE
        animation.interpolator = AccelerateDecelerateInterpolator()
        animation.start()


        dialog!!.window!!.setContentView(relativeLayout, layoutParams)
        dialog!!.window!!.setBackgroundDrawable(
                ColorDrawable(android.graphics.Color.TRANSPARENT))


    }


    fun setProgressMessage(message: String): Dialog {

        if (textView != null)
            textView!!.text = message

        return this
    }

    fun setProgressMessageSize(size: Int): Dialog {

        if (textView != null)
            textView!!.textSize = size.toFloat()

        return this
    }

    fun setProgressMessageColour(colour: Int): Dialog {

        if (textView != null)
            textView!!.setTextColor(colour)

        return this
    }

    fun setIcon(resId: Int): Dialog {

        if (imageView != null) {
            imageView!!.setImageResource(resId)

        }

        return this
    }


}


3 commentaires

Cela fonctionne pour votre ImageView mais cela ne fonctionne pas pour ProgressBar . Pourriez-vous s'il vous plaît vérifier et me faire savoir si cela fonctionne également pour ProgressBar ? Je veux simplement afficher une barre de progression. Pas d'image, pas de texte.


J'ai sélectionné votre réponse. J'ai également modifié votre code sans créer une autre classe. Veuillez vous référer à mon autre réponse. Merci pour les conseils.


Les méthodes showProgress et ignoreProgress que j'ai écrites veilleront à ce qu'une seule instance de la boîte de dialogue soit créée et affichée à la fois. Je m'occuperai également de l'exception qui peut être causée lors de la fermeture du dialogue lorsque l'activité est sur le point de se terminer.



0
votes

Merci à ADM et à Reddy pour leurs conseils. Enfin, j'ai pu afficher une barre de progression en utilisant la boîte de dialogue,

var loadingDialog: Dialog? = null

fun showLoadingDialog() {

    loadingDialog = Dialog(this)

    loadingDialog?.window?.requestFeature(Window.FEATURE_NO_TITLE)
    loadingDialog?.setCancelable(true)

    val relativeLayout = RelativeLayout(this)
    relativeLayout.layoutParams = RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)

    val progressBar = ProgressBar(this, null, android.R.attr.progressBarStyleLarge)
    val params = RelativeLayout.LayoutParams(150, 150)
    params.addRule(RelativeLayout.CENTER_IN_PARENT)

    relativeLayout.addView(progressBar, params)

    loadingDialog?.window?.setContentView(relativeLayout, relativeLayout.layoutParams)
        loadingDialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        loadingDialog?.show()
}

fun hideLoadingDialog(){

    loadingDialog?.hide()
}


0 commentaires