Подтвердить что ты не робот

ProgressDialog устарел. Каким будет альтернативный вариант?

Я сталкивался, чтобы видеть, что ProgressDialog теперь устарел. Что бы использовать вместо этого, кроме ProgressBar. Я использую Android Studio версии 2.3.3.

ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
4b9b3361

Ответ 1

Да, в API level 26 это устарело. Вместо этого вы можете использовать progressBar.

Чтобы создать его программно:

Сначала получите ссылку на корневой макет

RelativeLayout layout = findViewById(R.id.display);  //specify here Root layout Id

или

RelativeLayout layout = findViewById(this);

Затем добавьте индикатор выполнения.

progressBar = new ProgressBar(youractivity.this, null, android.R.attr.progressBarStyleLarge);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 100);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(progressBar, params);

Показать индикатор выполнения

progressBar.setVisibility(View.VISIBLE);

Чтобы скрыть индикатор выполнения

progressBar.setVisibility(View.GONE);

Чтобы отключить взаимодействие с пользователем, вам просто нужно добавить следующее  код

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                           WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Чтобы вернуть взаимодействие с пользователем, вам просто нужно добавить следующий код

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Просто для дальнейшего использования измените android.R.attr.progressBarStyleSmall на android.R.attr.progressBarStyleHorizontal.

Код ниже работает только выше API level 21

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

Чтобы создать его через XML:

<ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:max="100"
        android:backgroundTint="@color/white"
        android:layout_below="@+id/framelauout"
        android:indeterminateTint="#1a09d6"
        android:layout_marginTop="-7dp"/>

В вашей деятельности

progressBar = (ProgressBar) findViewById(R.id.progressbar);

Показывать/скрывать индикатор выполнения - то же самое

 progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar 
 progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar

Вот пример изображения того, как это будет выглядеть:

Для более подробной информации:
1. Ссылка одна
2. Ссылка вторая

Ответ 2

Этот класс устарел на уровне API 26. ProgressDialog является модальным диалог, который не позволяет пользователю взаимодействовать с приложением. Вместо использования этого класса, вы должны использовать индикатор прогресса, например ProgressBar, который может быть встроен в пользовательский интерфейс приложения. С другой стороны, вы можете использовать уведомление, чтобы информировать пользователя о ходе выполнения задачи. ссылка

Он устарел при Android O из-за Google нового стандарта пользовательского интерфейса

Ответ 3

Вы можете использовать AlertDialog как ProgressDialog см. ниже для кода ProgressDialog. Эту функцию вам нужно вызывать всякий раз, когда вы показываете диалог прогресса.

Код:

    public void setProgressDialog() {

    int llPadding = 30;
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.HORIZONTAL);
    ll.setPadding(llPadding, llPadding, llPadding, llPadding);
    ll.setGravity(Gravity.CENTER);
    LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    ll.setLayoutParams(llParam);

    ProgressBar progressBar = new ProgressBar(this);
    progressBar.setIndeterminate(true);
    progressBar.setPadding(0, 0, llPadding, 0);
    progressBar.setLayoutParams(llParam);

    llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    TextView tvText = new TextView(this);
    tvText.setText("Loading ...");
    tvText.setTextColor(Color.parseColor("#000000"));
    tvText.setTextSize(20);
    tvText.setLayoutParams(llParam);

    ll.addView(progressBar);
    ll.addView(tvText);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setView(ll);

    AlertDialog dialog = builder.create();
    dialog.show();
    Window window = dialog.getWindow();
    if (window != null) {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.copyFrom(dialog.getWindow().getAttributes());
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setAttributes(layoutParams);
    }
}

Выход:

enter image description here

Ответ 4

Вы можете просто спроектировать xml-интерфейс для вашего индикатора выполнения и передать его в качестве представления AlertDialog, а затем показать или закрыть диалоговое окно в любое время.

progress.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="13dp"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ProgressBar
        android:id="@+id/loader"
        android:layout_marginEnd="5dp"
        android:layout_width="45dp"
        android:layout_height="45dp" />
    <TextView
        android:layout_width="wrap_content"
        android:text="Loading..."
        android:textAppearance="?android:textAppearanceSmall"
        android:layout_gravity="center_vertical"
        android:id="@+id/loading_msg"
        android:layout_toEndOf="@+id/loader"
        android:layout_height="wrap_content" />

</LinearLayout>

Код, который отображает диалог прогресса. Просто скопируйте этот код и вставьте его в свой фрагмент.

   private void setDialog(boolean show){
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        //View view = getLayoutInflater().inflate(R.layout.progress);
        builder.setView(R.layout.progress);
        Dialog dialog = builder.create();
        if (show)dialog.show();
        else dialog.dismiss();
    }

Затем просто вызывайте метод всякий раз, когда вы хотите показать progressdialog, и передайте true в качестве аргумента, чтобы показать его, или false, чтобы закрыть диалоговое окно.

Ответ 5

ProgressBar очень прост и удобен в использовании, я собираюсь сделать то же самое, что и простой диалог прогресса. Первым шагом является то, что вы можете сделать XML-макет диалога, который вы хотите показать, скажем, мы назовем этот макет

layout_loading_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="20dp">
    <ProgressBar
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:text="Please wait! This may take a moment." />
</LinearLayout>

Следующим шагом является создание AlertDialog, который покажет этот макет с ProgressBar

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false); // if you want user to wait for some process to finish,
builder.setView(R.layout.layout_loading_dialog);
AlertDialog dialog = builder.create();

Теперь все, что осталось, это показать и скрыть этот диалог в наших событиях кликов, как это

dialog.show(); // to show this dialog
dialog.dismiss(); // to hide this dialog

и это все, это должно работать, как вы можете видеть, это просто и легко реализовать ProgressBar вместо ProgressDialog. Теперь вы можете показать/закрыть это диалоговое окно либо в Handler, либо в ASyncTask, по вашему желанию.

Ответ 6

Ну, если вы действительно хотите пойти против их воли, вы все равно можете использовать Sweet Alert Dialog или создать его самостоятельно.

progress_dialog_layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="64dp" >

        <ProgressBar
            android:id="@+id/progressBar2"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />

        <TextView
            android:gravity="center|left"
            android:id="@+id/textView9"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textColor="@color/black"
            android:textSize="18sp"
            android:text="Downloading data. Please wait.." />
    </TableRow>
</RelativeLayout>

Java-код:

AlertDialog b;
AlertDialog.Builder dialogBuilder;

public void ShowProgressDialog() {
dialogBuilder = new AlertDialog.Builder(DataDownloadActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            View dialogView = inflater.inflate(R.layout.progress_dialog_layout, null);
            dialogBuilder.setView(dialogView);
            dialogBuilder.setCancelable(false);
            b = dialogBuilder.create();
            b.show();
        }

        public void HideProgressDialog(){

            b.dismiss();
        }

Ответ 7

Да, ProgressDialog устарела, а Dialog - нет.

Вы можете накачать свой собственный XML файл (содержащий индикатор выполнения и загружаемый текст) в свой объект диалога, а затем отобразить или скрыть его с помощью функций show() и dismiss(). Вот пример (Котлин):

Класс ProgressDialog:

class ProgressDialog {
companion object {
    fun progressDialog(context: Context): Dialog{
        val dialog = Dialog(context)
        val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null)
        dialog.setContentView(inflate)
        dialog.setCancelable(false)
        dialog.window!!.setBackgroundDrawable(
                ColorDrawable(Color.TRANSPARENT))
        return dialog
    }
  }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:background="#fff"
android:padding="13dp"
android:layout_height="wrap_content">
<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="100dp"
    android:layout_margin="7dp"
    android:layout_height="100dp"
    android:layout_above="@+id/no_jobs_pickups"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_margin="7dp"
    android:layout_toEndOf="@+id/progressBar"
    android:text="Loading..." />
</RelativeLayout>

В вашем коде: просто сделайте var dialog = ProgressDialog.progressDialog(context)

Показать: dialog.show()

Спрятать: dialog.dismiss()

Ответ 8

ProgressBar - лучшая альтернатива для ProgressDialog. Элемент пользовательского интерфейса, который указывает на ход операции.

Для получения дополнительной информации см. Этот документ Google: https://developer.android.com/reference/android/widget/ProgressBar.html

Ответ 9

Как упоминалось на странице документации, альтернативой является ProgressBar. ProgressDialog можно воспроизвести внешний вид, поместив ProgressBar в AlertDialog.

Вы все еще можете использовать его, но Android не хочет, чтобы вы использовали его, поэтому он устарел. Поэтому вам следует рассмотреть решение своей проблемы другим способом, например, встроить ProgressBar в свой Layout.

Ответ 10

ProgressDialog устарел на уровне API 26.

"Deprecated" относится к функциям или элементам, которые находятся в процессе замены более новыми.

ProgressDialog - это модальное диалоговое окно, которое не позволяет пользователю взаимодействовать с приложение. Вместо использования этого класса вы должны использовать прогресс такой как ProgressBar, который может быть встроен в приложение Пользовательский интерфейс.

Преимущество

Я бы сказал, что ProgressBar имеет край над двумя. ProgressBar - это элемент пользовательского интерфейса, который указывает ход выполнения операции. Отображение индикаторов выполнения для пользователя в без прерывания. Покажите индикатор выполнения в пользовательском интерфейсе приложения.

Ответ 11

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

Настройка Gradle

Добавьте следующую зависимость в module/build.gradle:

compile 'com.lmntrx.android.library.livin.missme:missme:0.1.5'

Как это использовать?

Использование аналогично оригинальному ProgressDialog

ProgressDialog progressDialog = new 
progressDialog(YourActivity.this);
progressDialog.setMessage("Please wait");
progressDialog.setCancelable(false);
progressDialog.show();
progressDialog.dismiss();

NB. Вы должны переопределить действие onBackPressed()

Реализация Java8:

@Override
public void onBackPressed() {
    progressDialog.onBackPressed(
            () -> {
                super.onBackPressed();
                return null;
            }
    );
}

Реализация Kotlin:

override fun onBackPressed() {
   progressDialog.onBackPressed { super.onBackPressed() }
}

Ответ 12

Возможно, этот guide может вам помочь.

Обычно я предпочитаю создавать пользовательские AlertDialog с индикаторами. Он решает такие проблемы, как настройка вида приложения.

Ответ 13

Это может помочь другим людям.

Множество популярных приложений имеют разный подход, чтобы показать ход чего-либо вроде сетевого запроса, загрузки файлов и т.д. Загрузочный счетчик не показывает, сколько контента было загружено или осталось загрузить. Существует неопределенный период неопределенности в перспективе UI/UX. Многие популярные приложения (Facebook, Linkedin и т.д.) Разрешили эту проблему, показывая сначала пользовательский интерфейс barebones. Затем загруженный контент постепенно заполняется на экране.

Я использовал shimmer для своих приложений, чтобы решить эту проблему.

Существует хорошая статья об этом, которая будет полезной для других людей

Ответ 14

Я использую DelayedProgressDialog из https://github.com/Q115/DelayedProgressDialog Он делает то же самое, что и ProgressDialog с дополнительным преимуществом задержки при необходимости.

Использование его похоже на ProgressDialog перед Android O:

DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");

Ответ 15

Вам не нужно импортировать пользовательскую библиотеку.

Я предпочитаю использовать современный AlertDialog, так что это версия Kotlin для великолепного ответа, размещенного Кишаном Донгой на этой странице.

Код Котлина:

fun setProgressDialog(context:Context, message:String):AlertDialog {
    val llPadding = 30
    val ll = LinearLayout(context)
    ll.orientation = LinearLayout.HORIZONTAL
    ll.setPadding(llPadding, llPadding, llPadding, llPadding)
    ll.gravity = Gravity.CENTER
    var llParam = LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.WRAP_CONTENT,
                  LinearLayout.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    ll.layoutParams = llParam

    val progressBar = ProgressBar(context)
    progressBar.isIndeterminate = true
    progressBar.setPadding(0, 0, llPadding, 0)
    progressBar.layoutParams = llParam

    llParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    val tvText = TextView(context)
    tvText.text = message
    tvText.setTextColor(Color.parseColor("#000000"))
    tvText.textSize = 20.toFloat()
    tvText.layoutParams = llParam

    ll.addView(progressBar)
    ll.addView(tvText)

    val builder = AlertDialog.Builder(context)
    builder.setCancelable(true)
    builder.setView(ll)

    val dialog = builder.create()
    val window = dialog.window
    if (window != null) {
        val layoutParams = WindowManager.LayoutParams()
        layoutParams.copyFrom(dialog.window?.attributes)
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT
                dialog.window?.attributes = layoutParams
    }
    return dialog
}

Использование:

val dialog = setProgressDialog(this, "Loading..")
dialog.show()

Выход:

enter image description here

Ответ 16

Вы можете использовать SpotDialog, используя библиотеку wasabee, если вы можете найти полный учебник по следующей ссылке:

Пример SpotsDialog в Android

Ответ 17

В диалоговом окне выполнения пользователь не может выполнять какую-либо работу. Все фоновые процессы останавливаются во время диалога прогресса. Таким образом, желательно, чтобы пользователь прогресс-бар, а не диалог прогресса.