Android自定义Dialog(Loading)

由于项目需要,要求UI要漂亮,不可避免的需要重写Android的一些默认组建,在此分享下重写Dialog 加载和 Dialog对话框的经历。

先来说加载dialog(上面没有按钮,登陆和远程加载数据需要),Dialog对话框下次介绍。

第一步:建立自定义Dialog布局页面:dialog_loading.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@drawable/dialog_bg"
    android:orientation="horizontal" >

    <ProgressBar
        style="?android:progressBarStyle"
        android:layout_width="27.0dip"
        android:layout_height="27.0dip"
        android:layout_gravity="center_vertical"
        android:indeterminateDrawable="@drawable/progress_refresh_rotate"
        android:visibility="visible" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10.0dip"
        android:text="@string/loading"
        android:textColor="#ff565656"
        android:textSize="18.0sp" />

</LinearLayout>

界面很简单,主要用到系统的ProgressBar,加入了自定义样式,即:android:indeterminateDrawable="@drawable/progress_refresh_rotate",

progress_refresh_rotate是一个界面,设置一张图片后使用Android rotate旋转动画,实现加载图片资源的旋转。TextView就是在加载界面上的文字提示。

progress_refresh_rotate.xml放于drawable目录下,如果没有该目录,自己建立即可。

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/blue_loading"
    android:duration="50"
    android:pivotX="50.0%"
    android:pivotY="50.0%" />

第二步:重写系统Dialog,直接贴代码

package com.antrou.wfs.dialog;

import com.antrou.R;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;

/**
 * 自定义加载进度Dialog
* @author THL(HanleyTowne)
* @date 2013-4-21 下午6:00:26
*
 */
public class LoadingProgress extends Dialog {
    
    
    public LoadingProgress(Context context, int theme){
        super(context, theme);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_loading);
    }

    
}

在OnCreate中指定刚刚写好的布局文件,需要注意的是上面提供了构造函数,提供了2个参数,其中theme参数是一个style主题,下面会介绍。

第三步:在style.xml下添加Dialog主题样式

    
    <style name="MyDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
    

这里需要说明下 android:windowBackground 元素:值设置为: @android:color/transparent,如果是设置android:background属性,同样是@android:color/transparent,dialog

是会有黑边的.所以请使用 android:windowBackground 属性。

第四步:使用LoadingDialog

Dialog dialog = new LoginProgress(XXXActivity.this, R.style.MyDialog);
dialog.show();

大功告成。放上用到的两张png,有没有感觉很眼熟,好吧,我承认是扒下QQ的图片。

原文地址:https://www.cnblogs.com/hanleytang/p/3041985.html