Как легко центрировать индикатор прогресса в ProgressDialog (когда заголовок/текст не передавался)

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

(Я подал это как запрос функции в http://code.google.com/p/android/issues/detail?id=9697, пожалуйста, запустите его, если вы также хотели бы, чтобы это улучшилось).

Теперь мои вопросы:

  • Как я могу легко центрировать изображение прогресса, не создавая собственный собственный класс диалогового окна предупреждения? Любой параметр, который я мог упустить?

  • Кроме того, как задать фон прозрачным?

Мне также интересно: https://stackoverflow.com/info/2866141/how-to-put-custom-animation-into-a-progressdialog Я еще не пробовал это самостоятельно, но если вы не можете создавать пользовательские анимации, это означает, что если вам нужен анимированный индикатор прогресса, вам всегда нужно расширить класс ProgressDialog? Однако, глядя на класс ProgressDialog, я не нахожу ничего, кроме обычных ссылок (ProgressDialog.java), они не используют AnimatedDrawable есть.

Ответ 1

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

Ответ 2

Легкий и настраиваемый способ:

Определить анимацию: (RES/вытяжка/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/макет/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

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

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

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

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>

Ответ 5

//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();
}

Ответ 6

Просто сделайте следующий метод для его создания

В стилях 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);

Ответ 7

Вы всегда можете добавить один 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);

Ответ 8

Использование 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