代码之家  ›  专栏  ›  技术社区  ›  Mathias Conradt

如何在ProgressDialog中轻松将进度指示器居中(当没有标题/文本传递时)

  •  62
  • Mathias Conradt  · 技术社区  · 15 年前

    打电话时 progressDialog = ProgressDialog.show(this, null, null, true); 通常,开发人员只希望显示进度指示图像,并且通常希望它集中在窗口中(至少从常规UI设计的角度来看)。 但图像太左了,似乎右侧的一些填充/边距仍在为右侧的(可选)文本计算,尽管我们不会将任何文本作为参数传递。 这只会让开发人员的生活变得更简单:)所以我们不需要创建一个自定义对话框,只为了让进度指示器在默认情况下居中。

    (我将此作为特征请求提交至 http://code.google.com/p/android/issues/detail?id=9697 ;如果您也希望看到这个改进,请在上面加上星号)。

    现在我的问题是:

    1. 如何在不完全创建自己的自定义警报对话框类的情况下轻松地将进度图像居中?我可能忽略了任何参数?

    2. 此外,如何将背景设置为透明?

    我还想知道: https://stackoverflow.com/questions/2866141/how-to-put-custom-animation-into-a-progressdialog 我还没有亲自尝试过,但是如果你不能创建自定义动画,这意味着如果你想要一种动画进度指示器,你总是需要扩展ProgressDialog类? 但是,在progressdialog类中,除了常规的drawables之外,我没有找到其他任何东西。( ProgressDialog.java )他们没有在那里使用动画绘制。

    8 回复  |  直到 8 年前
        1
  •  104
  •   JLamkin    11 年前

    我做了一些测试,我觉得实现这一点的最佳方法是定制 Dialog .

    下面是我所做的一个例子。这将回答问题2,但会让您了解如何解决问题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);
        }
    }
    

    所有静态方法都来自 this 链接,没有什么奇怪的,但是神奇发生在构造函数中。 检查是否将样式作为参数传递。该样式如下:

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

    结果是 ProgressBar 在屏幕中心旋转。没有 backgroundDim 而没有 对话 盒子。

        2
  •  32
  •   Richard Lalancette    11 年前

    简单且可定制的方式:

    定义动画: (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%" />
    

    或:

    <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>
    

    然后,定义布局: (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>
    

    然后,实例进度对话框:

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

    更多信息:

        3
  •  24
  •   egalot    12 年前

    我使用下面的,它不需要布局文件,并在屏幕中间放置一个居中的、无边界的阻塞进度条。

    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();
        }
    
    }
    
        4
  •  19
  •   Thafer Shahin    11 年前

    如果只想显示不确定的进度条。

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

    并创建一个名为“progress-layout.xml”的布局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>
    
        5
  •  4
  •   Arun Mohan    8 年前

    只需按以下方法完成

    在res->values->样式中添加以下代码

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

    然后创建您的ProgressDialog,如下所述

    ProgressDialog dialog = new ProgressDialog(ctx, R.style.MyGravity);
    dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
    
        6
  •  2
  •   Puthuumalar    13 年前
    //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();
    }
    
        7
  •  0
  •   Rathore    8 年前

    您可以在所有活动中添加一个ProgressBar,以便在其中显示居中的ProgressDialog。在acitivity.xml中使用以下内容:

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

    在acitivity.java中,使用

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

    现在,当您想要显示进度条时,只需将其可见性设置为可见,而取消时,将可见性设置为不可见。

    bar.setVisibility(View.VISIBLE);
    bar.setVisibility(View.GONE);
    
        8
  •  -1
  •   Bo Persson Touseef    13 年前

    使用ProgressBar并将其添加到LinearLayout在我的示例中的效果如下:

    progressbar mspinner=new progressbar(this);
    mspinner.setlayoutParams(新的layoutParams(layoutParams.wrap_content,layoutParams.wrap_content));
    mspinner.backgroundresource(r.drawable.loading_1);
    mspinner.setInterminate(真);
    < /代码> 
    
    

    :

    ProgressBar mSpinner = new ProgressBar(this); 
    mSpinner.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    mSpinner.setBackgroundResource(R.drawable.loading_1);
    mSpinner.setIndeterminate(true);
    

    enter image description here

    推荐文章