Как легко отцентрировать индикатор прогресса в ProgressDialog (когда заголовок / текст не передается) - PullRequest
62 голосов
/ 12 июля 2010

При вызове progressDialog = ProgressDialog.show(this, null, null, true); обычно разработчики хотят показывать только изображение индикатора прогресса и обычно ожидают, что оно будет находиться в центре окна (по крайней мере, с точки зрения обычного дизайна пользовательского интерфейса). Но изображение слишком далеко слева, кажется, что некоторые отступы / поля справа все еще рассчитываются для (необязательного) текста справа, хотя мы не передаем текст в качестве параметра. Это просто немного облегчит жизнь разработчику :) Так что нам не нужно создавать собственный диалог только для того, чтобы индикатор прогресса центрировался по умолчанию.

(Я подал это как запрос функции на 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, я не нахожу ничего, кроме обычных рисоваемых объектов (хотя ProgressDialog.java ), там они не используют AnimatedDrawable.

Ответы [ 8 ]

104 голосов
/ 12 июля 2010

Я провел некоторое тестирование, и я чувствую, что лучший способ добиться этого - сделать кастом 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);
    }
}

Все статические методы получены из этой ссылки, ничего странного, но магияпроисходит в конструкторе.Проверьте, что я передаю в качестве параметра стиль.Этот стиль выглядит следующим образом:

<?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 и без поля Dialog.

32 голосов
/ 02 апреля 2012

Простой и настраиваемый способ:

Определение анимации: (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();

Дополнительная информация:

24 голосов
/ 01 августа 2013

Я использую следующее, для него не требуется файл макета, и в центре экрана помещается центрированный индикатор выполнения блокировки без полей.

19 голосов
/ 20 декабря 2013

Если вы хотите отображать только неопределенный индикатор выполнения.

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

И создайте макет XML-файла с именем «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>
4 голосов
/ 18 марта 2017

Просто выполните приведенный ниже метод, чтобы выполнить его.

В res-> values-> styles добавьте следующий код

<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);
2 голосов
/ 22 ноября 2011
//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();
}
0 голосов
/ 23 июля 2017

Вы всегда можете добавить один ProgressBar во все ваши действия, где вы можете показывать центрированный ProgressDialog. Используйте следующее в файле acitivity.xml As:

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

Теперь, когда вы хотите показать ProgressBar, просто установите его видимость видимым, а для отмены установите видимость пропавшим.

bar.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
0 голосов
/ 13 августа 2012

Использование ProgressBar и добавление его в LinearLayout работало в моем случае следующим образом:

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

...