Как легко центрировать индикатор прогресса в ProgressDialog (когда нет заголовка / текста)
при вызове progressDialog = ProgressDialog.show(this, null, null, true);
обычно разработчики хотят показывать только изображение индикатора хода выполнения, и обычно он ожидал бы быть центрированным в окне (по крайней мере, с точки зрения обычного дизайна пользовательского интерфейса).
Но изображение слишком далеко слева, кажется, что некоторые отступы/поля с правой стороны все еще вычисляются для (необязательного) текста справа, хотя мы не передаем текст в качестве параметра.
Это просто сделает жизнь немного проще для разработчика :) так что нам не нужно создайте пользовательский диалог только для того, чтобы индикатор выполнения был центрирован по умолчанию.
(Я подал это как запрос функции в http://code.google.com/p/android/issues/detail?id=9697; пожалуйста, звезда его, если вы также хотите, чтобы это улучшилось).
теперь мои вопросы:
Как я могу легко центрировать изображение прогресса без необходимости полностью создавать свой собственный класс диалогового окна оповещения? Любой параметр, который я мог бы иметь упустили из виду?
кроме того, как установить фон прозрачным?
Мне тоже интересно об этом: https://stackoverflow.com/questions/2866141/how-to-put-custom-animation-into-a-progressdialog Я сам еще не пробовал, но если вы не можете создавать пользовательские анимации, это означает, что если вам нужен какой-то анимированный индикатор прогресса, вам всегда нужно расширять класс ProgressDialog? Глядя на Хотя класс ProgressDialog, я не нахожу ничего, кроме обычных чертежей (ProgressDialog.java), они не используют AnimatedDrawable там.
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);