Я сталкивался, чтобы видеть, что ProgressDialog
теперь осуждается. Что бы использовать вместо этого, кроме ProgressBar
. Я использую Android Studio версии 2.3.3.
ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
Я сталкивался, чтобы видеть, что ProgressDialog
теперь осуждается. Что бы использовать вместо этого, кроме ProgressBar
. Я использую Android Studio версии 2.3.3.
ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
Ответы:
Да, 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. Ссылка два
Вы можете использовать, 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);
}
}
Вывод:
AlertDialog
быть, не следует использовать здесь.
Этот класс устарел на уровне API 26. ProgressDialog - это модальное диалоговое окно, которое не позволяет пользователю взаимодействовать с приложением. Вместо использования этого класса вы должны использовать индикатор прогресса, такой как ProgressBar, который может быть встроен в пользовательский интерфейс вашего приложения. Кроме того, вы можете использовать уведомление, чтобы проинформировать пользователя о ходе выполнения задачи. ссылка на сайт
Это устарело Android O
из-за Google
нового стандарта пользовательского интерфейса
Вы можете просто спроектировать интерфейс 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>
Код, который отображает диалог прогресса. Просто скопируйте этот код и вставьте его в свой фрагмент.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
private void setDialog(boolean show){
builder.setView(R.layout.progress);
Dialog dialog = builder.create();
if (show)dialog.show();
else dialog.dismiss();
}
Затем просто вызывайте метод всякий раз, когда вы хотите показать progressdialog, и передайте true в качестве аргумента, чтобы показать его, или false, чтобы закрыть диалоговое окно.
this
, чтобы она выглядела так. AlertDialog.Builder builder = new AlertDialog.Builder(this);
Пожалуйста, убедитесь, что вы копируете правильный код.
layout_toEndOf
могут быть удалены, поскольку не дляLinearLayout
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, по вашему желанию.
progress_dialog.show();
на builder.show();
. Спасибо.
show()
/ dismiss()
, но я не поставил его, builder.show()
потому что тогда, чтобы отменить его, мы должны были бы сделать это, dialog.dismiss()
что вводит в заблуждение тех, кто любит, чтобы их код был простым и легким для понимания, а также потому что builder.show()
возвращает AlertDialog
объект, и нам нужно будет сохранить эту ссылку, как AlertDialog dialog = builder.show();
тогда, сделать dialog.dismiss()
легче builder.create()
возвращать в некотором AlertDialog
объекте, а затем использовать этот объект, чтобы показать и скрыть диалог
Да, 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()
Ну, если вы действительно хотите пойти против их воли, вы все равно можете использовать 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();
}
HideProgress
ничего не делает.
ProgressBar - лучшая альтернатива для ProgressDialog. Элемент пользовательского интерфейса, который указывает на ход операции.
Для получения дополнительной информации см. Этот документ Google: https://developer.android.com/reference/android/widget/ProgressBar.html
Вам не нужно импортировать любую пользовательскую библиотеку.
Я предпочитаю использовать модерн, 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()
view!!.context
Как уже упоминалось на странице документации, альтернатива есть ProgressBar
. ProgressDialog
Внешний вид может быть воспроизведен путем размещения ProgressBar
в AlertDialog
.
Вы все еще можете использовать его, но Android не хочет, чтобы вы использовали его, поэтому он устарел. Таким образом, вы должны рассмотреть решение вашей проблемы другим способом, например, встраивание ProgressBar
в вашу Layout
.
ProgressDialog
устарел на уровне API 26.
относится к функциям или элементам, которые находятся в процессе замены на более новые."Deprecated"
ProgressDialog - это модальное диалоговое окно, которое не позволяет пользователю взаимодействовать с приложением. Вместо использования этого класса вы должны использовать индикатор прогресса, например
ProgressBar
, который может быть встроен в пользовательский интерфейс вашего приложения.
преимущество
Я бы лично сказал, что ProgressBar
имеет преимущество над двумя. ProgressBar
является элементом пользовательского интерфейса, который указывает на ход операции. Отображать индикаторы выполнения для пользователя без перерыва . Показать индикатор выполнения в пользовательском интерфейсе вашего приложения.
Я использую DelayedProgressDialog из https://github.com/Q115/DelayedProgressDialog. Он делает то же самое, что и ProgressDialog, с дополнительным преимуществом задержки при необходимости.
Использование аналогично ProgressDialog до Android O:
DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
Вы можете использовать этот класс, который я написал. Он предлагает только основные функции. Если вам нужен полнофункциональный ProgressDialog, используйте эту легковесную библиотеку .
Добавьте следующую зависимость в 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() }
}
Может быть, это руководство может помочь вам.
Обычно я предпочитаю делать собственные AlertDialogs с индикаторами. Это решает такие проблемы, как настройка представления приложения.
Это может помочь другим людям.
Во многих популярных приложениях используется другой подход, позволяющий показать ход выполнения каких-либо задач, таких как сетевой запрос, загрузка файла и т. Д. При загрузке счетчик не показывает, сколько контента было загружено или осталось загрузить. Существует период неопределенности, что плохо с точки зрения UI / UX. Множество популярных приложений (Facebook, Linkedin и т. Д.) Решили эту проблему, сначала показав голые интерфейсы пользователя. Затем загруженный контент постепенно заполняется на экране.
Я использовал мерцание для своих приложений, чтобы решить эту проблему.
Есть хорошая статья об этом, которая будет полезна для других людей.
В диалоговом окне выполнения пользователь не может выполнять какую-либо работу. Все фоновые процессы останавливаются во время диалога прогресса. Таким образом, желательно, чтобы пользователь прогресс-бар, а не диалог прогресса.
Вы можете использовать SpotDialog , используя библиотеку wasabee, если вы можете найти полный учебник по следующей ссылке: