`
lxq_xsyu
  • 浏览: 65365 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Android 自定义progressDialog实现

 
阅读更多

我们在项目中经常会遇到这样一个应用场景:执行某个耗时操作时,为了安抚用户等待的烦躁心情我们一般会使用进度条之类的空间,在android中让大家最 容易想到的就是progressbar或者progressDialog,区别在于前者是一个控件,后者是对话框。由于一些需求在弹出进度条时不希望用户 能够操作其他控件,所以只能使用progressDialog,这个时候有遇到了一个问题,我不想要progressDialog的黑色框框,感觉这样跟 应用的整体风格不协调,这个时候就考虑了写一个自定义的progressDialog。
在网上搜过很多自定义progressDialog的例子,对着写了下,但是没有任何效果,不知道是自己使用的方法不对还是什么地方出错了。通过不断的查找资料,写了一个简单的自定义progressDialog。先上图看下效果:

Android 自定义progressDialog实现

1.String.xml 文件,progressDialog是继承与Dialog,先设置一下progressDialog的风格,设置背景透明色。
01 <stylename="CustomDialog"parent="@android:style/Theme.Dialog">
02 <itemname="android:windowFrame">@null</item>
03 <itemname="android:windowIsFloating">true</item>
04 <itemname="android:windowContentOverlay">@null</item>
05 <itemname="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
06 <itemname="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
07 </style>
08
09 <stylename="CustomProgressDialog"parent="@style/CustomDialog">
10 <itemname="android:windowBackground">@android:color/transparent</item>
11 <itemname="android:windowNoTitle">true</item>
12 </style>
2.customprogressdialog.xml文件,定义自己的布局,由于我的需求只需要一个进度条以及一串显示的内容,所以布局比较接单
01 <?xmlversion="1.0"encoding="utf-8"?>
02 <LinearLayout
03 xmlns:android="http://schemas.android.com/apk/res/android"
04 android:layout_width="fill_parent"
05 android:layout_height="fill_parent"
06 android:orientation="horizontal">
07 <ImageView
08 android:id="@+id/loadingImageView"
09 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:background="@anim/progress_round"/>
12 <TextView
13 android:id="@+id/id_tv_loadingmsg"
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content"
16 android:layout_gravity="center_vertical"
17 android:textSize="20dp"/>
18 </LinearLayout>
3.progress_round.xml文件.这个文件为了实现转动的效果,循环显示这些图片。
01 <?xmlversion="1.0"encoding="utf-8"?>
02 <animation-list
03 xmlns:android="http://schemas.android.com/apk/res/android"
04 android:oneshot="false">
05 <itemandroid:drawable="@drawable/progress_1"android:duration="200"/>
06 <itemandroid:drawable="@drawable/progress_2"android:duration="200"/>
07 <itemandroid:drawable="@drawable/progress_3"android:duration="200"/>
08 <itemandroid:drawable="@drawable/progress_4"android:duration="200"/>
09 <itemandroid:drawable="@drawable/progress_5"android:duration="200"/>
10 <itemandroid:drawable="@drawable/progress_6"android:duration="200"/>
11 <itemandroid:drawable="@drawable/progress_7"android:duration="200"/>
12 <itemandroid:drawable="@drawable/progress_8"android:duration="200"/>
13 </animation-list>
4.CustomProgressDialog.java文件,这个是就是我们最终需要使用的progressDialog了。
01 /**************************************************************************************
02 * [Project]
03 * MyProgressDialog
04 * [Package]
05 * com.lxd.widgets
06 * [FileName]
07 * CustomProgressDialog.java
08 * [Copyright]
09 * Copyright 2012 LXD All Rights Reserved.
10 * [History]
11 * Version Date Author Record
12 *--------------------------------------------------------------------------------------
13 * 1.0.0 2012-4-27 lxd (rohsuton@gmail.com) Create
14 **************************************************************************************/
15
16 packagecom.lxd.widgets;
17
18
19 importcom.lxd.activity.R;
20
21 importandroid.app.Dialog;
22 importandroid.content.Context;
23 importandroid.graphics.drawable.AnimationDrawable;
24 importandroid.view.Gravity;
25 importandroid.widget.ImageView;
26 importandroid.widget.TextView;
27
28
29 /********************************************************************
30 * [Summary]
31 * TODO 请在此处简要描述此类所实现的功能。因为这项注释主要是为了在IDE环境中生成tip帮助,务必简明扼要
32 * [Remarks]
33 * TODO 请在此处详细描述类的功能、调用方法、注意事项、以及与其它类的关系.
34 *******************************************************************/
35
36 publicclassCustomProgressDialogextendsDialog {
37 privateContext context =null;
38 privatestaticCustomProgressDialog customProgressDialog =null;
39
40 publicCustomProgressDialog(Context context){
41 super(context);
42 this.context = context;
43 }
44
45 publicCustomProgressDialog(Context context,inttheme) {
46 super(context, theme);
47 }
48
49 publicstaticCustomProgressDialog createDialog(Context context){
50 customProgressDialog =newCustomProgressDialog(context,R.style.CustomProgressDialog);
51 customProgressDialog.setContentView(R.layout.customprogressdialog);
52 customProgressDialog.getWindow().getAttributes().gravity = Gravity.CENTER;
53
54 returncustomProgressDialog;
55 }
56
57 publicvoidonWindowFocusChanged(booleanhasFocus){
58
59 if(customProgressDialog ==null){
60 return;
61 }
62
63 ImageView imageView = (ImageView) customProgressDialog.findViewById(R.id.loadingImageView);
64 AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
65 animationDrawable.start();
66 }
67
68 /**
69 *
70 * [Summary]
71 * setTitile 标题
72 * @param strTitle
73 * @return
74 *
75 */
76 publicCustomProgressDialog setTitile(String strTitle){
77 returncustomProgressDialog;
78 }
79
80 /**
81 *
82 * [Summary]
83 * setMessage 提示内容
84 * @param strMessage
85 * @return
86 *
87 */
88 publicCustomProgressDialog setMessage(String strMessage){
89 TextView tvMsg = (TextView)customProgressDialog.findViewById(R.id.id_tv_loadingmsg);
90
91 if(tvMsg !=null){
92 tvMsg.setText(strMessage);
93 }
94
95 returncustomProgressDialog;
96 }
97 }
5.接下来就是写一个测试activity调用我们的progressDialog了。
01 packagecom.lxd.activity;
02
03 importcom.lxd.widgets.CustomProgressDialog;
04
05 importandroid.app.Activity;
06 importandroid.os.AsyncTask;
07 importandroid.os.Bundle;
08 importandroid.view.Window;
09 importandroid.view.WindowManager;
10
11 publicclassMainFrameextendsActivity {
12 privateMainFrameTask mMainFrameTask =null;
13 privateCustomProgressDialog progressDialog =null;
14
15 @Override
16 publicvoidonCreate(Bundle savedInstanceState) {
17 super.onCreate(savedInstanceState);
18 this.requestWindowFeature(Window.FEATURE_NO_TITLE);
19 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
20 WindowManager.LayoutParams.FLAG_FULLSCREEN);
21
22 setContentView(R.layout.main);
23
24 mMainFrameTask =newMainFrameTask(this);
25 mMainFrameTask.execute();
26 }
27
28 @Override
29 protectedvoidonDestroy() {
30 stopProgressDialog();
31
32 if(mMainFrameTask !=null&& !mMainFrameTask.isCancelled()){
33 mMainFrameTask.cancel(true);
34 }
35
36 super.onDestroy();
37 }
38
39 privatevoidstartProgressDialog(){
40 if(progressDialog ==null){
41 progressDialog = CustomProgressDialog.createDialog(this);
42 progressDialog.setMessage("正在加载中...");
43 }
44
45 progressDialog.show();
46 }
47
48 privatevoidstopProgressDialog(){
49 if(progressDialog !=null){
50 progressDialog.dismiss();
51 progressDialog =null;
52 }
53 }
54
55 publicclassMainFrameTaskextendsAsyncTask<Integer, String, Integer>{
56 privateMainFrame mainFrame =null;
57
58 publicMainFrameTask(MainFrame mainFrame){
59 this.mainFrame = mainFrame;
60 }
61
62 @Override
63 protectedvoidonCancelled() {
64 stopProgressDialog();
65 super.onCancelled();
66 }
67
68 @Override
69 protectedInteger doInBackground(Integer... params) {
70
71 try{
72 Thread.sleep(10*1000);
73 }catch(InterruptedException e) {
74 e.printStackTrace();
75 }
76 returnnull;
77 }
78
79 @Override
80 protectedvoidonPreExecute() {
81 startProgressDialog();
82 }
83
84 @Override
85 protectedvoidonPostExecute(Integer result) {
86 stopProgressDialog();
87 }
88
89
90
91 }
92 }
这样我们需要的progressDialog效果就出来了
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics