标签:android
有时,我们需要访问网络才能获取到需要操作的任务数(例如下载的文件数),而在服务器返回任务数之前要想隐藏进度百分比和进度数值,就需要我们自己重写ProgressDialog。等到获取到任务数后再把进度值和百分比显示出来。先上效果图:

关键代码:
public class CustomProgressDialog extends ProgressDialog {
private final String TAG = this.getClass().getSimpleName();
public CustomProgressDialog(Context context) {
super(context);
}
public CustomProgressDialog(Context context, int theme) {
super(context, theme);
// TODO Auto-generated constructor stub
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
hideNumerAndPercent();
}
private void hideNumerAndPercent() {
setNumerPercentState(View.INVISIBLE);
}
public void showNumerAndPercent() {
setNumerPercentState(View.VISIBLE);
}
private void setNumerPercentState(int visibility) {
try {
Method method = TextView.class.getMethod("setVisibility",
Integer.TYPE);
Field numField = this.getClass().getSuperclass()
.getDeclaredField("mProgressNumber");
numField.setAccessible(true);
TextView numTextView = (TextView) numField.get(this);
method.invoke(numTextView, visibility);
Field percentField = this.getClass().getSuperclass()
.getDeclaredField("mProgressPercent");
percentField.setAccessible(true);
TextView percentTextView = (TextView) percentField.get(this);
method.invoke(percentTextView, visibility);
} catch (Exception e) {
Log.e(TAG,
"Failed to invoke the progressDialog method 'setVisibility' and set 'mProgressNumber' to GONE.",
e);
}
}
}public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new TestTask(this, null).execute("test");
}
public class TestTask extends AsyncTask<String, Integer, Void> {
private Context context;
private Handler mHandler;
private CustomProgressDialog pd;
private final int SHOW_NUMBER = 1;
private final int PROGRESS_INCREMENT = 2;
private final int FAIL = -1;
public TestTask(Context context,Handler handler) {
this.context = context;
this.mHandler=handler;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (pd != null) {
pd.cancel();
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new CustomProgressDialog(context);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setCancelable(false);
pd.setTitle("同步中");
pd.setMessage("请稍后,正在同步数据...");
pd.setIndeterminate(true);
pd.show();
}
@Override
protected Void doInBackground(String... params) {
try {
/*模拟向服务器获取任务数所耗费的时间*/
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*任务数,实际由服务器返回*/
int count=4;
publishProgress(SHOW_NUMBER,count);
int i=0;
while(i<count)
{
try {
/*模拟执行每条任务所耗费的时间*/
Thread.sleep(1400);
publishProgress(PROGRESS_INCREMENT,1);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
switch (values[0]) {
case SHOW_NUMBER:
pd.setMax(values[1]);
pd.showNumerAndPercent();
pd.setIndeterminate(false);
break;
case PROGRESS_INCREMENT:
pd.setProgress(pd.getProgress()+values[1]);
break;
default:
break;
}
}
}
}
自定义ProgressDialog实现暂时隐藏进度值并显示等待状态(附源码下载)
标签:android
原文地址:http://blog.csdn.net/u011494050/article/details/39214175