加载旋转框(loading spinner)
目标是这样的

用到的组件 AlertDialog 和 ProgressBar
先创建一个 AlertDialog 的布局
<?xml version="1.0" encoding="utf-8"?>
<!-- File: res/layout/dialog_loading.xml -->
<ProgressBar
style="?android:progressBarStyleLarge"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
接下来创建弹窗类,需要将背景设置为透明,否则背景很难看
package com.seliote.loadingdialog;
/**
* File: com/seliote/loadingdialog/LoadingDialog.java
*/
import android.content.Context;
import android.support.v7.app.AlertDialog;
public class LoadingDialog {
private Context mContext;
private AlertDialog mAlertDialog;
public LoadingDialog(Context aContext) {
mContext = aContext;
mAlertDialog = new AlertDialog.Builder(mContext)
.setView(R.layout.dialog_loading)
.create();
// Set AlertDialog background to transparent
mAlertDialog.getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);
}
public void show() {
if (!mAlertDialog.isShowing()) {
mAlertDialog.show();
}
}
public void dismiss() {
if (mAlertDialog.isShowing()) {
mAlertDialog.dismiss();
}
}
}
效果

背景在弹窗后自动变暗,不怎么好看,修改一下
res/layout/styles.xml 中添加 style 标签
<!-- Disable background dim for AlertDialog -->
<style name="NoDimAlertDialog" parent="Theme.AppCompat.Dialog.Alert">
<item name="android:backgroundDimEnabled">false</item>
</style>
应用标签,LoadingDialog.java 中创建 AlertDialog 时使用自定义样式
mAlertDialog = new AlertDialog.Builder(mContext, R.style.NoDimAlertDialog)
效果

ok,大体完成
再来点微调,下方加上提示符,loading_dialog.xml 改为
<?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="vertical">
<!-- style="?android:progressBarStyleLarge" 变成大圈 -->
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>
<!-- 颜色默认为白色,记得改一下,不然看不到 -->
<TextView
android:id="@+id/loading_dialog_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
android:text="@string/default_loading_dialog_text"
android:textSize="16sp"
android:textAllCaps="false"
android:textColor="@android:color/darker_gray"/>
</LinearLayout>
LoadingDialog.java 改为
package com.seliote.driftbottle.component;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.seliote.driftbottle.R;
/**
* 加载旋转框,用于耗时操作时堵塞用户操作
*/
public class LoadingDialog {
private Context mContext;
private AlertDialog mAlertDialog;
private View mView;
/**
* 构造一个可以阻塞用户操作的的弹窗对象
*
* @param aContext 上下文对象
*/
public LoadingDialog(Context aContext) {
this.mContext = aContext;
this.mView = LayoutInflater.from(aContext).inflate(R.layout.dialog_loading, null);
this.mAlertDialog = new AlertDialog
.Builder(this.mContext, R.style.NoDimAlertDialog)
.setView(this.mView)
.setCancelable(false)
.create();
// 将背景设置为透明的
this.mAlertDialog.getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);
}
/**
* 构造一个可以阻塞用户操作的的弹窗对象,并指定提示字符
*
* @param aContext 上下文对象
* @param aPromptText 提示字符
*/
public LoadingDialog(Context aContext, @NonNull String aPromptText) {
this.mContext = aContext;
this.mView = LayoutInflater.from(aContext).inflate(R.layout.dialog_loading, null);
TextView textView = this.mView.findViewById(R.id.loading_dialog_text_view);
textView.setText(aPromptText);
this.mAlertDialog = new AlertDialog
.Builder(this.mContext, R.style.NoDimAlertDialog)
.setView(this.mView)
.setCancelable(false)
.create();
// 将背景设置为透明的
this.mAlertDialog.getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);
}
/**
* 显示弹窗
*/
public void show() {
if (!this.mAlertDialog.isShowing()) {
this.mAlertDialog.show();
}
}
/**
* 隐藏弹窗
*/
public void dismiss() {
if (this.mAlertDialog.isShowing()) {
this.mAlertDialog.dismiss();
}
}
/**
* 更改提示字符
*
* @param aPrompt 提示字符
*/
public void changePrompt(String aPrompt) {
TextView textView = this.mView.findViewById(R.id.loading_dialog_text_view);
textView.setText(aPrompt);
}
}
加载旋转框(loading spinner)的更多相关文章
- js spin 加载动画(loading)
js spin 加载动画 最近做页面ajax加载是又用到loading动画,还好有一个spin.js 具体的包大家可以去http://fgnass.github.com/spin.js/下载, 如果想 ...
- IOS开发UI篇之──自定义加载等待框(MBProgressHUD)
本文转载至 http://blog.csdn.net/xunyn/article/details/8064984 原文地址http://www.189works.com/article-89289 ...
- js图片未加载完显示loading效果
<html> <title>js图片未加载完显示loading效果</title> <body> <style> img{float:lef ...
- flutter的加载弹框
代码组件: import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'packa ...
- 安卓 自定义AlertDialog对话框(加载提示框)
AlertDialog有以下六种使用方法: 一.简单的AlertDialog(只显示一段简单的信息) 二.带按钮的AlertDialog(显示提示信息,让用户操作) 三.类似ListView的Aler ...
- JS实现页面加载完毕之前loading提示效果
1.获取浏览器页面可见高度和宽度 var _PageHeight = document.documentElement.clientHeight, _PageWidth = document.docu ...
- js实现的页面加载完毕之前loading提示效果
页面加载readyState的五种状态 原文如下: 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loadin ...
- 加载页面(Loading)
/* 文件说明:页面加载时Loading JS 文件描述:解决IE或FF下,初始化加载时,页面布局乱掉的问题,参考:*/var width = $(window).width();var height ...
- appcloud 加载第三方页面loading效果
apiready = function() { var header = $api.byId('header'); $api.fixIos7Bar(header); var headerPos = $ ...
随机推荐
- 使用sqlloader向oracle导入文本数据
文本文件如下,注意文件名必须有后缀,文本行首也需要|分隔符:[oracle@ycr test]$ more person.txt|aaa|123|m|aaa|123|m|aaa|123|m|aaa|1 ...
- 【转】netstat 命令当中的内部地址和外部地址分别代表的是什么?
RT,用自己的话解释,不要搬网上的内容.尽量可以简洁,谢谢 2015-03-07 17:41 提问者采纳 网络连接是有2方参与,自己就是“内部地址”,别人就是“外部地址”,就这么简洁. 再举个例子 ...
- 【转】有关onpropertychange事件
<div style="border:1px solid #fc0;height:24px;width:300px;" id="target">&l ...
- [19/03/22-星期五] 异常(Exception)(二)_捕获异常
一.概念 捕获异常是通过3个关键词来实现的:try-catch-finally.用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它, 最后一步是通过f ...
- 2018.11.10 Mac设置Eclipse的 .m2文件夹是否可见操作&&Mac系统显示当前文件夹的路径设置
第一行就是设置为可见的记得要重启Finder不然是没有效果的 第二行就是设置为不可见的 打开"终端"(应用程序->实用工具),输入以下两条命令: defaults write ...
- About me and this site(2018/8/28)
Name: 李秋豪 / [lǐ qiū háo] I'm a junior majoring in InfoSec at Harbin Institute of Technology. I'm int ...
- Android学习笔记_23_服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数
一.了解AIDL语言: 在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的.因此要传递对象, 需要把对象解析 ...
- 我的wmware
1.vmware 网络连接方式 NAT 模式: 虚拟机的IP 是由NAT分配的,电脑环境无论如何变化,都不会影响虚拟机 好处:在家.学校.公司,连接虚拟机都可以使用相同的ip地址 桥接模式: 只要更换 ...
- 重写equals方法(未完)
equals方法是我们日常编程中很常见的方法,Object中对这个方法的解释如下: boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”. 查看该方法的底层代码如 ...
- iOS之出现( linker command failed with exit code 1)错误总结
本文出自:http://blog.csdn.NET/hengshujiyi/article/details/21182813 补充:我出现这个错误是一个工程中有两个同名的文件,只要删除掉一个就好了,可 ...