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


при вызове 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 62

8 ответов:

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

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

задать анимацию: (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();

Подробнее:

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

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

}

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

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>

Просто Сделать Ниже Метод, Чтобы Сделать Это

в res - > значения - > стили добавить ниже код

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

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

в Активити.java, используйте

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

Теперь, когда вы хотите показать ProgressBar, просто установите его видимость видимой, а чтобы отменить, установите видимость в gone.

bar.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);

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