Я сталкивался, чтобы видеть, что 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. Ссылка вторая
Этот класс устарел на уровне API 26. ProgressDialog является модальным диалог, который не позволяет пользователю взаимодействовать с приложением. Вместо использования этого класса, вы должны использовать индикатор прогресса, например ProgressBar, который может быть встроен в пользовательский интерфейс приложения. С другой стороны, вы можете использовать уведомление, чтобы информировать пользователя о ходе выполнения задачи. ссылка
Он устарел при Android O
из-за Google
нового стандарта пользовательского интерфейса
Вы можете использовать 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);
}
}
Выход:
Вы можете просто спроектировать 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, чтобы закрыть диалоговое окно.
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, по вашему желанию.
Ну, если вы действительно хотите пойти против их воли, вы все равно можете использовать 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();
}
Да, 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()
ProgressBar - лучшая альтернатива для ProgressDialog. Элемент пользовательского интерфейса, который указывает на ход операции.
Для получения дополнительной информации см. Этот документ Google: https://developer.android.com/reference/android/widget/ProgressBar.html
Как упоминалось на странице документации, альтернативой является ProgressBar
. ProgressDialog
можно воспроизвести внешний вид, поместив ProgressBar
в AlertDialog
.
Вы все еще можете использовать его, но Android не хочет, чтобы вы использовали его, поэтому он устарел. Поэтому вам следует рассмотреть решение своей проблемы другим способом, например, встроить ProgressBar
в свой Layout
.
ProgressDialog
устарел на уровне API 26.
относится к функциям или элементам, которые находятся в процессе замены более новыми."Deprecated"
ProgressDialog - это модальное диалоговое окно, которое не позволяет пользователю взаимодействовать с приложение. Вместо использования этого класса вы должны использовать прогресс такой как
ProgressBar
, который может быть встроен в приложение Пользовательский интерфейс.
Преимущество
Я бы сказал, что ProgressBar
имеет край над двумя. ProgressBar
- это элемент пользовательского интерфейса, который указывает ход выполнения операции. Отображение индикаторов выполнения для пользователя в без прерывания. Покажите индикатор выполнения в пользовательском интерфейсе приложения.
Вы можете использовать этот класс, который я написал. Он предлагает только основные функции. Если вам нужен полнофункциональный 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() }
}
Возможно, этот guide может вам помочь.
Обычно я предпочитаю создавать пользовательские AlertDialog с индикаторами. Он решает такие проблемы, как настройка вида приложения.
Это может помочь другим людям.
Множество популярных приложений имеют разный подход, чтобы показать ход чего-либо вроде сетевого запроса, загрузки файлов и т.д. Загрузочный счетчик не показывает, сколько контента было загружено или осталось загрузить. Существует неопределенный период неопределенности в перспективе UI/UX. Многие популярные приложения (Facebook, Linkedin и т.д.) Разрешили эту проблему, показывая сначала пользовательский интерфейс barebones. Затем загруженный контент постепенно заполняется на экране.
Я использовал shimmer для своих приложений, чтобы решить эту проблему.
Существует хорошая статья об этом, которая будет полезной для других людей
Я использую DelayedProgressDialog из https://github.com/Q115/DelayedProgressDialog Он делает то же самое, что и ProgressDialog с дополнительным преимуществом задержки при необходимости.
Использование его похоже на ProgressDialog перед Android O:
DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
Вам не нужно импортировать пользовательскую библиотеку.
Я предпочитаю использовать современный 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()
Вы можете использовать SpotDialog, используя библиотеку wasabee, если вы можете найти полный учебник по следующей ссылке:
В диалоговом окне выполнения пользователь не может выполнять какую-либо работу. Все фоновые процессы останавливаются во время диалога прогресса. Таким образом, желательно, чтобы пользователь прогресс-бар, а не диалог прогресса.
Вы можете использовать Уведомления с индикатором выполнения, но на уровне API есть некоторые требования.