Android ProgressDialog 控件自定义

在项目中,我们经常需要通过网络请求去服务端获取相应的数据,以便于在客户端进行展示。而这个过程是需要网络的,因此就有了等待的过程。对于网络快的童靴,那么等待的时间就短;而对于网络慢的童靴,那么等待的时间就长。因此为了消除童靴们等待的焦虑感,我们需要显示一个progress dialog来提示童靴们,数据正在获取中,请稍候片刻。

先上效果图,效果图如下:

   

那么如何实现呢?直接上代码

1. 在anim文件夹下创建sf_progress_dialog_anim.xml,实现转动的效果:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >

    <item
        android:drawable="@drawable/sf_progress_1"
        android:duration="200"/>
    <item
        android:drawable="@drawable/sf_progress_2"
        android:duration="200"/>
    <item
        android:drawable="@drawable/sf_progress_3"
        android:duration="200"/>
    <item
        android:drawable="@drawable/sf_progress_4"
        android:duration="200"/>
    <item
        android:drawable="@drawable/sf_progress_5"
        android:duration="200"/>
    <item
        android:drawable="@drawable/sf_progress_6"
        android:duration="200"/>
    <item
        android:drawable="@drawable/sf_progress_7"
        android:duration="200"/>
    <item
        android:drawable="@drawable/sf_progress_8"
        android:duration="60"/>

</animation-list>

其中:android:oneshot表示动画只播放一次停留在最后一帧上,当设置为false时,则代表动画循环播放;否则,则代表动画只播放一次。

资源文件可到如下链接进行下载:

http://download.csdn.net/detail/shenjichao2008/8248073

2. 在values文件夹中创建style.xml,自定义progress dialog的样式:

<style name="SF_dialogCustom" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>

    <style name="SF_pressDialogCustom" parent="@style/SF_dialogCustom">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
    </style>

3. 在layout文件夹中创建sf_view_custom_progress_dialog.xml,自定义progress dilaog的布局:

<?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="horizontal" >

    <ImageView
        android:id="@+id/sf_iv_progress_dialog_loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@anim/sf_progress_dialog_anim"
        android:contentDescription="@string/sf_progress_dialog_image_loading" />

    <TextView
        android:id="@+id/sf_tv_progress_dialog_loading"
        style="@style/SF_MediumLightGreyTxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical" />

</LinearLayout>

4. 创建SFProgrssDialog类,继承Dialog,实现如下:

package com.snapfish.view;

import com.snapfish.R;

import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.text.TextUtils;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.TextView;

public class SFProgrssDialog extends Dialog {

	private static SFProgrssDialog m_progrssDialog;

	private SFProgrssDialog(Context context, int theme) {
		super(context, theme);
	}

	public static SFProgrssDialog createProgrssDialog(Context context) {
		m_progrssDialog = new SFProgrssDialog(context,
				R.style.SF_pressDialogCustom);
		m_progrssDialog.setContentView(R.layout.sf_view_custom_progress_dialog);
		m_progrssDialog.getWindow().getAttributes().gravity = Gravity.CENTER;

		return m_progrssDialog;
	}

	@Override
	public void onWindowFocusChanged(boolean hasFocus) {
		if (null == m_progrssDialog)
			return;

		ImageView loadingImageView = (ImageView) m_progrssDialog
				.findViewById(R.id.sf_iv_progress_dialog_loading);
		AnimationDrawable animationDrawable = (AnimationDrawable) loadingImageView
				.getBackground();
		animationDrawable.start();
	}

	public SFProgrssDialog setMessage(String msg) {
		TextView loadingTextView = (TextView) m_progrssDialog
				.findViewById(R.id.sf_tv_progress_dialog_loading);
		if (!TextUtils.isEmpty(msg))
			loadingTextView.setText(msg);
		else
			loadingTextView.setText(R.string.sf_progress_dialog_image_loading);

		return m_progrssDialog;
	}

}

5. 编写显示/隐藏 progress dialog的方法:

private SFProgrssDialog m_customProgrssDialog;
final void showCustomProgrssDialog(String msg) {
		if (null == m_customProgrssDialog)
			m_customProgrssDialog = SFProgrssDialog
					.createProgrssDialog(m_parent);

		if (null != m_customProgrssDialog) {
			m_customProgrssDialog.setMessage(msg);
			m_customProgrssDialog.show();
			m_customProgrssDialog.setCancelable(false);
		}
	}

final void hideCustomProgressDialog() {
		if (null != m_customProgrssDialog) {
			m_customProgrssDialog.dismiss();
			m_customProgrssDialog = null;
		}
	}

6. 在网络请求之前,调用showCustomProgrssDialog方法,传入显示的message;在网络响应之后,调用hideProgressDialog方法,消除progress dialog。

时间: 2024-11-06 03:51:18

Android ProgressDialog 控件自定义的相关文章

android:ProgressDialog控件

ProgressDialog 和 AlertDialog 有点类似,都可以在界面上弹出一个对话框,都能够屏蔽 掉其他控件的交互能力.不同的是,ProgressDialog 会在对话框中显示一个进度条,一般是 用于表示当前操作比较耗时,让用户耐心地等待.它的用法和 AlertDialog 也比较相似,修 改 MainActivity 中的代码,如下所示: public class MainActivity extends Activity implements OnClickListener {

android控件---自定义带文本的ImageButton

由于SDK提供的ImageButton只能添加图片,不能添加文字:而Button控件添加的文字只能显示在图片内部:当我们需要添加文字在图片外部时就不能满足我们的需求了,顾只能自己写个自定义ImageButton.说是ImageButton,其实并不是继承于ImageButton,而是从LinearLayout继承,由于LinearLayout是线性排列,通过setOrientation(LinearLayout.VERTICAL)的方式达到View垂直排列的目的,所以很简单,只需要添加两个Vie

ArcGIS for Android地图控件的5大常见操作

原文地址: ArcGIS for Android地图控件的5大常见操作 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/arcgis_mobile/article/details/7801467   GIS的开发中,什么时候都少不了地图操作.ArcGIS for Android中,地图组件就是MapView,MapView是基于Android中ViewGroup的一个类(参考),也是ArcGIS Runtime SDK for

Android常见控件初探

温故而知新.最近复习了一些android常用控件,接下来,根据android 官方API,总结一下它们的一些常见用法.(开发测试环境为Android4.4) 一.TextView 由官方的关系图可以看出,TextView继承View类,直接子类有Button,CheckedTextView等,间接子类有AutoCompleteTextView, CheckBox等. 下面列举一些TextView常见的xml属性: android:text TextView显示的文字 android:textCo

【Android的从零单排开发日记】之入门篇(十三)——Android的控件解析

Android的控件都派生自android.view.View类,在android.widget包中定义了大量的系统控件供开发者使用,开发者也可以从View类及其子类中,派生出自定义的控件. 一.Android的控件结构 Android中有一类重要的控件,称为容器控件,它们派生自View的子类android.view.ViewGroup.每个容器控件都可以作为父控件存在,其中包含若干个子控件,每个子控件占据其父控件的一块区域,统一由父控件进行管理和支配. 交互界面中控件的关系直观上是极其复杂的,

Android必备:Android UI控件的了解与学习

看这里:Android必备:Android UI控件的了解与学习 由于工作需要,最近一段时间,需要进行Android App开发的学习,之前简单的进行过Android的了解,对于基本的Android环境的搭建等已经有过整理,一个Android App是由一个或多个Activity组成,每一个Activity都是一个UI容器,也就是一个屏幕界面,一个界面的组成则是由一组Android UI控件组成,本篇,我们就来简单的对Android UI控件进行初步的了解和学习. Android UI控件根据其

android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码

Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android课程表控件效果源码 Dagger.Clean.MVP框架搭建,快速开发- Andorid 任意界面悬浮窗,实现悬浮窗如此简单 android模仿QQ登录后保存账号和密码效果源码 Android简洁清爽的Todo清单工具(MVP+okhttp3+retrofit+gson) Android优质博客 K

Android常用控件:进度条

各种进度条属于 ProgressBar的子类 Sytle: 水平风格:Horizontal小风格:Small大风格:Large反向风格:Inverse小反向风格:Small.Inverse大反向风格:Large.Inverse 设置style:   style="?android:attr/progressBarStyle..." 主要属性:最大值:max当前进度:progress次要进度值:SecondaryProgress --效果类似于看电影那些缓冲 判断进度条是转圈还是水平的方

Android 标签控件

版本:1.0 日期:2014.7.24 版权:© 2014 kince 转载注明出处 在有的应用中可能需要设置一些标签来方便用去去查询某些信息,比如手机助手或者购物软件之类都会有一些标签.对于软件开发初期来说,直接使用TextView.Button实现是最为简单的一种方式.但是这种方法也有其局限性,比如不能控制换行.耦合性低等缺点.所以除了解决这些问题之外,最好能够封装一个类库出来,方便以后使用. 首先新建一个Tag类, import java.io.Serializable; public c