android自定义下载,android自定义下载进度弹窗

使用的系统默认的progressdialog显示如下:

ProgressDialog progressDialog = new ProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

// 设置ProgressDialog 标题

progressDialog.setTitle("下载提示");

// 设置ProgressDialog 提示信息

progressDialog.setMessage("当前下载进度:");

// 设置ProgressDialog 是否可以按退回按键取消

progressDialog.setCancelable(true);

progressDialog.show();

progressDialog.setMax(18268544);

progressDialog.setProgress(1866954);

243bc0a794ba

Paste_Image.png

现在需要显示文件总大小和当前进度,以M为单位。

效果如下:

243bc0a794ba

Paste_Image.png

代码如下(完全参照系统的progressdialog)

public class DownloadProgressDialog extends AlertDialog {

/** Creates a ProgressDialog with a horizontal progress bar.

*/

public static final int STYLE_HORIZONTAL = 1;

private String mProgressNumberFormat;

private NumberFormat mProgressPercentFormat;

private ProgressBar mProgress;

private Handler mViewUpdateHandler;

private TextView mProgressNumber;

private TextView mProgressPercent;

private TextView mMessageView;

private int mProgressStyle = STYLE_SPINNER;

private int mMax;

private int mProgressVal;

private int mSecondaryProgressVal;

private int mIncrementBy;

private int mIncrementSecondaryBy;

private Drawable mProgressDrawable;

private Drawable mIndeterminateDrawable;

private CharSequence mMessage;

private boolean mIndeterminate;

private boolean mHasStarted;

protected DownloadProgressDialog(Context context) {

super(context);

initFormats();

}

protected DownloadProgressDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {

super(context, cancelable, cancelListener);

initFormats();

}

protected DownloadProgressDialog(Context context, @StyleRes int themeResId) {

super(context, themeResId);

initFormats();

}

private void initFormats() {

mProgressNumberFormat = "%1.2fM/%2.2fM";

mProgressPercentFormat = NumberFormat.getPercentInstance();

mProgressPercentFormat.setMaximumFractionDigits(0);

}

public static DownloadProgressDialog show(Context context, CharSequence title,

CharSequence message) {

return show(context, title, message, false);

}

public static DownloadProgressDialog show(Context context, CharSequence title,

CharSequence message, boolean indeterminate) {

return show(context, title, message, indeterminate, false, null);

}

public static DownloadProgressDialog show(Context context, CharSequence title,

CharSequence message, boolean indeterminate, boolean cancelable) {

return show(context, title, message, indeterminate, cancelable, null);

}

public static DownloadProgressDialog show(Context context, CharSequence title,

CharSequence message, boolean indeterminate,

boolean cancelable, OnCancelListener cancelListener) {

DownloadProgressDialog dialog = new DownloadProgressDialog(context);

dialog.setTitle(title);

dialog.setMessage(message);

dialog.setIndeterminate(indeterminate);

dialog.setCancelable(cancelable);

dialog.setOnCancelListener(cancelListener);

dialog.show();

return dialog;

}

@Override

protected void onCreate(Bundle savedInstanceState) {

LayoutInflater inflater = LayoutInflater.from(getContext());

if (mProgressStyle == STYLE_HORIZONTAL) {

mViewUpdateHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

/* Update the number and percent */

double progress =(double) mProgress.getProgress()/(double)(1024*1024);

double max = (double)mProgress.getMax()/(double)(1024*1024);

if (mProgressNumberFormat != null) {

String format = mProgressNumberFormat;

mProgressNumber.setText(String.format(format, progress, max));

} else {

mProgressNumber.setText("");

}

if (mProgressPercentFormat != null) {

double percent = (double) progress / (double) max;

SpannableString tmp = new SpannableString(mProgressPercentFormat.format(percent));

tmp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD),

0, tmp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

mProgressPercent.setText(tmp);

} else {

mProgressPercent.setText("");

}

}

};

View view = inflater.inflate(R.layout.alert_dialog_progress,null);

mProgress = (ProgressBar) view.findViewById(R.id.progress);

mProgressNumber = (TextView) view.findViewById(R.id.progress_number);

mProgressPercent = (TextView) view.findViewById(R.id.progress_percent);

setView(view);

}else{

View view = inflater.inflate(R.layout.progress_dialog, null);

mProgress = (ProgressBar) view.findViewById(R.id.progress);

mMessageView = (TextView) view.findViewById(R.id.message);

setView(view);

}

if (mMax > 0) {

setMax(mMax);

}

if (mProgressVal > 0) {

setProgress(mProgressVal);

}

if (mSecondaryProgressVal > 0) {

setSecondaryProgress(mSecondaryProgressVal);

}

if (mIncrementBy > 0) {

incrementProgressBy(mIncrementBy);

}

if (mIncrementSecondaryBy > 0) {

incrementSecondaryProgressBy(mIncrementSecondaryBy);

}

if (mProgressDrawable != null) {

setProgressDrawable(mProgressDrawable);

}

if (mIndeterminateDrawable != null) {

setIndeterminateDrawable(mIndeterminateDrawable);

}

if (mMessage != null) {

setMessage(mMessage);

}

setIndeterminate(mIndeterminate);

onProgressChanged();

super.onCreate(savedInstanceState);

}

@Override

public void onStart() {

super.onStart();

mHasStarted = true;

}

@Override

protected void onStop() {

super.onStop();

mHasStarted = false;

}

public void setProgress(int value) {

if (mHasStarted) {

mProgress.setProgress(value);

onProgressChanged();

} else {

mProgressVal = value;

}

}

public void setSecondaryProgress(int secondaryProgress) {

if (mProgress != null) {

mProgress.setSecondaryProgress(secondaryProgress);

onProgressChanged();

} else {

mSecondaryProgressVal = secondaryProgress;

}

}

public int getProgress() {

if (mProgress != null) {

return mProgress.getProgress();

}

return mProgressVal;

}

public int getSecondaryProgress() {

if (mProgress != null) {

return mProgress.getSecondaryProgress();

}

return mSecondaryProgressVal;

}

public int getMax() {

if (mProgress != null) {

return mProgress.getMax();

}

return mMax;

}

public void setMax(int max) {

if (mProgress != null) {

mProgress.setMax(max);

onProgressChanged();

} else {

mMax = max;

}

}

public void incrementProgressBy(int diff) {

if (mProgress != null) {

mProgress.incrementProgressBy(diff);

onProgressChanged();

} else {

mIncrementBy += diff;

}

}

public void incrementSecondaryProgressBy(int diff) {

if (mProgress != null) {

mProgress.incrementSecondaryProgressBy(diff);

onProgressChanged();

} else {

mIncrementSecondaryBy += diff;

}

}

public void setProgressDrawable(Drawable d) {

if (mProgress != null) {

mProgress.setProgressDrawable(d);

} else {

mProgressDrawable = d;

}

}

public void setIndeterminateDrawable(Drawable d) {

if (mProgress != null) {

mProgress.setIndeterminateDrawable(d);

} else {

mIndeterminateDrawable = d;

}

}

public void setIndeterminate(boolean indeterminate) {

if (mProgress != null) {

mProgress.setIndeterminate(indeterminate);

} else {

mIndeterminate = indeterminate;

}

}

public boolean isIndeterminate() {

if (mProgress != null) {

return mProgress.isIndeterminate();

}

return mIndeterminate;

}

@Override

public void setMessage(CharSequence message) {

if (mProgress != null) {

if (mProgressStyle == STYLE_HORIZONTAL) {

super.setMessage(message);

} else {

mMessageView.setText(message);

}

} else {

mMessage = message;

}

}

public void setProgressStyle(int style) {

mProgressStyle = style;

}

/**

* Change the format of the small text showing current and maximum units

* of progress. The default is "%1d/%2d".

* Should not be called during the number is progressing.

* @param format A string passed to {@link String#format String.format()};

* use "%1d" for the current number and "%2d" for the maximum. If null,

* nothing will be shown.

*/

public void setProgressNumberFormat(String format) {

mProgressNumberFormat = format;

onProgressChanged();

}

/**

* Change the format of the small text showing the percentage of progress.

* The default is

* {@link NumberFormat#getPercentInstance() NumberFormat.getPercentageInstnace().}

* Should not be called during the number is progressing.

* @param format An instance of a {@link NumberFormat} to generate the

* percentage text. If null, nothing will be shown.

*/

public void setProgressPercentFormat(NumberFormat format) {

mProgressPercentFormat = format;

onProgressChanged();

}

private void onProgressChanged() {

if (mProgressStyle == STYLE_HORIZONTAL) {

if (mViewUpdateHandler != null && !mViewUpdateHandler.hasMessages(0)) {

mViewUpdateHandler.sendEmptyMessage(0);

}

}

}

}

布局文件alert_dialog_progress

android:layout_width="wrap_content" android:layout_height="match_parent">

style="?android:attr/progressBarStyleHorizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="12dip"

android:layout_marginBottom="1dip"

android:layout_marginStart="10dip"

android:layout_marginEnd="10dip"

android:layout_centerHorizontal="true" />

android:id="@+id/progress_percent"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:paddingBottom="12dip"

android:layout_marginStart="10dip"

android:layout_marginEnd="10dip"

android:layout_alignParentStart="true"

android:layout_below="@id/progress"

android:layout_alignParentLeft="true" />

android:id="@+id/progress_number"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:paddingBottom="12dip"

android:layout_marginStart="10dip"

android:layout_marginEnd="10dip"

android:layout_alignParentEnd="true"

android:layout_below="@id/progress"

android:layout_alignParentRight="true" />

progress_dialog

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:baselineAligned="false"

android:paddingStart="8dip"

android:paddingTop="10dip"

android:paddingEnd="8dip"

android:paddingBottom="10dip">

style="?android:attr/progressBarStyle"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:max="10000"

android:layout_marginEnd="12dip"

android:layout_marginRight="12dip" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical" />

使用方法和progressdialog完全一下:

DownloadProgressDialog progressDialog = new DownloadProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

// 设置ProgressDialog 标题

progressDialog.setTitle("下载提示");

// 设置ProgressDialog 提示信息

progressDialog.setMessage("当前下载进度:");

// 设置ProgressDialog 标题图标

//progressDialog.setIcon(R.drawable.a);

// 设置ProgressDialog 进度条进度

// 设置ProgressDialog 的进度条是否不明确

progressDialog.setIndeterminate(false);

// 设置ProgressDialog 是否可以按退回按键取消

progressDialog.setCancelable(true);

progressDialog.show();

progressDialog.setMax(18268544);

progressDialog.setProgress(1866954);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值