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
ProgressBarfait 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 dialoguequi 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?