android 加载数据或提交数据时显示转圈的提示页面

提前声明一下,本博客全是自己的理解,如果内容中有理解错误的地方,欢迎指正。另外,博客内容有参考其他博客,本博客只用来学习。

当我们进入到一个页面时,通常先会出现一个转圈的dialog,这是因为这个页面需要加载数据,为了防止数据加载完成前空白的页面,通常会先显示转圈的dialog,直到数据加载完成,圈消失。那么,这个转圈的dialog是怎么实现的呢?

首先,先写 显示转圈的layout:progress_hud.xml

<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@drawable/progress_hud_bg"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="20dp"
    android:paddingLeft="30dp"
    android:paddingRight="30dp"
    android:paddingTop="20dp" >

    <ImageView
        android:id="@+id/spinnerImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@anim/spinner" />

    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="Message"
        android:textColor="#FFFFFF" />

</LinearLayout></span>

图片的背景是动画spinner,具体实现如下:

<span style="font-size:14px;"><animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >

    <item
        android:drawable="@drawable/spinner_0"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_1"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_2"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_3"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_4"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_5"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_6"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_7"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_8"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_9"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_10"
        android:duration="60"/>
    <item
        android:drawable="@drawable/spinner_11"
        android:duration="60"/>
</animation-list></span>

这里提一下安卓的动画。android支持3种动画模式,tween animation,frame animation和property
animation,这三种动画模式在SDK中被称为view animation,drawable animation和property animation。

tween animation(view
animation):补间动画。

frame animation(view animation):逐帧动画。

property animation:属性动画,这个是在Android 3.0中才引进的。

这里我们只介绍一下用到的逐帧动画。就像GIF图片,通过设置一系列图片(Drawable)依次显示来模拟动画的效果。必须以<animation-list>为根元素,以<item>表示要轮换显示的图片,duration属性表示各项显示的时间。上面的xml文件中:android:oneshot如果为true,则动画只播放一遍,false,则一直播放,直到设置它停止。android:duration为每张图片播放时间。

接下来就是我们的ProgressHUD类。

1. 首先是两个构造函数:

<span style="font-size:14px;"><span style="font-size:18px;">	</span><span style="font-size:14px;">public ProgressHUD(Context context) {
		super(context);
	}

	public ProgressHUD(Context context, int theme) {
		super(context, theme);
	}</span></span>

int
theme:设置progressHUD的style,一会儿讲。

2. 然后是onWindowFocusChanged方法。

<span style="font-size:14px;">	public void onWindowFocusChanged(boolean hasFocus){
		ImageView imageView = (ImageView) findViewById(R.id.spinnerImageView);
        <span style="white-space:pre">	</span>AnimationDrawable spinner = (AnimationDrawable) imageView.getBackground();
        <span style="white-space:pre">	</span>spinner.start();
</span>

onWindowFocusChanged()方法是在和拥护交互时调用的,activity获取到焦点或者失去焦点时都会调用,它在activity的生命周期中是这样的:

进入时:onStart---->onResume---->onWindowFocusChanged(true)

退出时:onPause---->onStop---->onWindowFocusChanged(false)

可见,只有在用户真正获取到屏幕焦点后会调用。所以,在onWindowFocusChanged方法中去启动动画spinner。

3. setMessage方法用来设置 转圈时,显示的文字,如“正在加载数据。。。”等。

<span style="font-size:14px;">	public void setMessage(CharSequence message) {
		if(message != null && message.length() > 0) {
			findViewById(R.id.message).setVisibility(View.VISIBLE);
			TextView txt = (TextView)findViewById(R.id.message);
			txt.setText(message);
			txt.invalidate();
		}
</span>

invalidate()方法的作用时请求重绘view树。事实上,在setVisibility()由可见变为不可见或者由不可见变为可见状态时,会自动调用invalidate()方法,我也不知道为什么此处又调用一次,我试了一下注释掉这行代码,也完全可以正常运行。

4. 最后是 show()方法。

<span style="font-size:14px;">	public static ProgressHUD show(Context context, CharSequence message, boolean indeterminate, boolean cancelable,
			OnCancelListener cancelListener) {
		ProgressHUD dialog = new ProgressHUD(context,R.style.ProgressHUD);
		dialog.setTitle("");
		dialog.setContentView(R.layout.progress_hud);
		if(message == null || message.length() == 0) {
			dialog.findViewById(R.id.message).setVisibility(View.GONE);
		} else {
			TextView txt = (TextView)dialog.findViewById(R.id.message);
			txt.setText(message);
		}
		dialog.setCancelable(cancelable);
		dialog.setOnCancelListener(cancelListener);
		dialog.getWindow().getAttributes().gravity=Gravity.CENTER;//设置dialog显示在屏幕中央
		WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
		lp.dimAmount=0.2f; //设置控件的黑暗度,值为0-1。0.0f完全不暗,1.0f完全黑暗。也可以设置控件的透明度,如:<span style="color: rgb(73, 73, 73); font-family: simsun; font-size: 16px; line-height: 24px; background-color: rgb(230, 232, 231);">lp.alpha=1.0f;</span>
		dialog.getWindow().setAttributes(lp);
		//dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
		dialog.show();
		return dialog;
	}	</span>

ProgressHUD类已完毕,我们再说一下R.style.ProgressHUD。

styles.xml:

<span style="font-size:14px;">    </style>
       <style name="ProgressHUD" 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>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
   </style>
</span>

大致说一下。windowFrame:Dialog的windowFrame框为无

windowIsFloating:是否浮现在activity之上

windowContentOverlay:设置窗体内容背景

windowAnimationStyle:设置动画

windowSoftInputMode:

活动的主窗口如何与包含屏幕上的软键盘窗口交互。这个属性的设置将会影响两件事情:

1>     软键盘的状态——是否它是隐藏或显示——当活动(Activity)成为用户关注的焦点。

2>     活动的主窗口调整——否减少活动主窗口大小以便腾出空间放软键盘或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。

"stateUnspecified" 软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。

"adjustPan"
该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

windowBackground:设置dialog的背景

windowNoTitle:是否显示title

至此,自定义的progressdialog实现已经完成,最后就是调用它的activity了,如下:

<span style="font-size:14px;">public class MainActivity extends ActionBarActivity {

	private Context context;
	public ProgressHUD mProgressHUD;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
    }

    public void loadDataStyle1(View view){
        showMyDialog(true);
    }

    public void showMyDialog( boolean isCancelable) {
	mProgressHUD = ProgressHUD.show(context, "加载中", true, isCancelable, null);}
	</span>

activity_main.xm:

<span style="font-size:14px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.loaddatastyle.MainActivity" >

    <Button
        android:id="@+id/style1Btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="45dp"
        android:onClick="loadDataStyle1"
        android:text="点击按钮,开始加载数据" />

</RelativeLayout></span>

源代码地址:http://download.csdn.net/detail/u010127250/9023275

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 15:18:17

android 加载数据或提交数据时显示转圈的提示页面的相关文章

Android Demo之旅 ListView底部添加加载更多按钮实现数据分页

在我们的实际项目中,数据应该说是很多的,我们的ListView不可能一下子把数据全部加载进来,我们可以当滚动条滚动到ListView的底部的时候,给一个更多的提示,当我们点击它即加载下一页的数据,相当与我们的分页效果,参考网上的东西,写了一个小小的demo,并总结了一些知识点,功能图如下:    源代码下载地址:http://download.csdn.net/detail/harderxin/7762625 掌握知识点: 1)自定义Adapter,将数据和ListView绑定起来 2)理解La

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

ViewPage+frament不预加载下一个Frament数据解决办法

在做一个ViewPage+Frament 滑动数效果,当滑动到每一页时加载哪一页的数据,但是ViewPage会预加载下一也数据,这个问题之前做项目是一直未解决,今天找到一个方法一下子就解决的这个问题,Frament里面有一个setUserVisibleHint方法,setUserVisibleHint每次fragment显示与隐藏都会调用,下面说一下这个方法的使用 @Override public void setUserVisibleHint(boolean isVisibleToUser)

高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)

写在前面 好的书,可能你第一遍并不能领会里面的精魂,当再次细细品评的时候,发现领悟的又是一层新的含义 (这段时间,工作上也不会像从前一样做起来毫不费力,开始有了新的挑战,现在的老大让我既佩服又嫉妒,但真的是打心底里仰慕,希望自己有朝一日能过到他那个高度) 既然现在还达不到那个层次,就好好堆砖吧,当砖堆到一定高度也自然会上一个小台阶. 脚本位置 脚本会阻塞页面渲染,直到它们全部下载并执行完成,页面才会继续渲染.页面只有加载并执行完前面一个script外部文件才会去加载下面一个script标签. 在

ajax数据加载过程中进行数据加载提示

方法1:$(function(){ $.get("URL", function(Msg){ $("你要显示提示的地方").html("数据正在加载中.."); $("你要显示查询数据的地方").html(Msg); }); }); 方法2: <html><head> <title></title></head><body><input type=&q

D3.js加载csv和json数据

1.加载数据的基本命令 D3提供了方法可以对不同的数据类型进行加载,比如d3.text(), d3.xml(), d3.json(), d3.csv(), 和d3.html(). <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>test</title> &l

ExtJS ComboBox同时加载远程和本地数据

ExtJS ComboBox同时加载远程和本地数据 原文:http://gblog.hbcf.net/index.php/archives/233 ComboBox比较特殊需求,将远程数据和本地数据同时加载.其实,还是先加载远程,在将本地数据塞进获取到的远程数据中去.大概的代码如下(网上得来,未验证,以备用) //首先远程读取数据 var seriesStore = new Ext.data.JsonStore({ url: '', fields: ['seriesid', 'seriesnam

Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗