如何在ProgressDialog中轻松地集中进度指示器(当没有标题/文本传递时)

当调用progressDialog = ProgressDialog.show(this, null, null, true); 通常开发人员只想显示进度指示图像,通常会期望以窗口为中心(至less从常规UIdevise的angular度来看)。 但是图像太左了,似乎右边的一些填充/边距仍然在右边的(可选的)文本中计算,尽pipe我们没有传递任何文本作为参数。 这只会让开发人员的生活变得简单:)所以我们不需要创build一个自定义的对话框来让默认的进度指示器居中。

(我在http://code.google.com/p/android/issues/detail?id=9697上提出了这个function请求;如果您希望看到这个改进,请将它列为星号)。

现在我的问题:

  1. 我怎样才能轻松地居中进度图像,而不必完全创build自己的自定义警报对话框类? 我可能忽略的任何参数?

  2. 另外,如何将背景设置为透明?

我也想知道这个: https : //stackoverflow.com/questions/2866141/how-to-put-custom-animation-into-a-progressdialog我还没有实际上自己尝试过,但如果你不能创build自定义animation,这意味着如果你想要一种animation进度指示器,你总是需要扩展ProgressDialog类? 虽然看ProgressDialog类,但除了常规drawable( ProgressDialog.java )之外,我没有发现任何东西,它们在那里没有使用AnimatedDrawable。

我做了一些testing,我觉得最好的方法是做一个自定义的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); } } 

所有的静态方法都来自这个链接,没有什么奇怪的,但魔法发生在构造函数中。 检查我作为parameter passing一个样式。 这种风格如下:

 <?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

简单和可定制的方式:

定义animation: (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); 

并创build一个名为“progress_layout.xml”的布局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-> styles中添加下面的代码

 <style name="MyGravity" parent="android:Theme.Material.Dialog" ></style> 

然后创build你的ProgressDialog,如下所述

 ProgressDialog dialog = new ProgressDialog(ctx, R.style.MyGravity); dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); 

您可以随时在您想要显示居中ProgressDialog的所有活动中添加一个ProgressBar。 在acitivity.xml中使用以下内容:

 <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); 

在这里输入图像说明