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();
4 Réponses :
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)); }
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.
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" />
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?
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 } }
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.
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() }
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 uneboî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?