Как сосредоточить индикатор прогресса в 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 там.

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

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

Определить анимацию: (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> 
 //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(); } 

Просто сделайте метод ниже, чтобы получить его.

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

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

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

Введите описание изображения здесь