文档章节

使用android ProgressBar和Toast生成一个界面

simpower
 simpower
发布于 2014/10/04 11:53
字数 1539
阅读 64
收藏 0
点赞 0
评论 0

首先我需要这样一个界面

这个界面是在使用AudioManager.adjustStreamVolume(int streamType, int direction, int flags)显示出来的,记住flags这里传 AudioManager.FLAG_SHOW_UI才会显示

不然只是逻辑上调整了某个流的声音,用户他看不到界面不知道成功与否。

然后我有一个功能界面是和这个一样的,但功能不一样,好吧,我知道android自带的界面并不好看,但这里只是说明原理和方法,美观不予讨论。

这里核心的2个组件就是一个TextView和ProgressBar。如果自定义的话,需要写一个layout来包裹这2个组件 然后当点击一个按钮时显示出来。

让我们在回到android自带的界面中,当他点击一个按钮时,他会弹出来并且隔一会就会自动消失。这个自动消失我觉得很有用,因为用户只需要调整那一会

能看到界面的改变就行了,不需要一直显示,不然还要让用户在点个返回?多么麻烦呢,操作简单才是重要的。

于是我想到了android 自带的toast有这个功能。好的!大方向确定了,就开始写代码吧

逻辑是这样的让用户点击某个按钮时,弹出上面那个界面,然后过一会消失,这里在显示toast的时候还需要调用改变进度条进度的方法。

接下来上代码吧:

复制代码

    // ////////////////////////先生成一个toast和progress界面
       pb = new ProgressBar(context, null,

               android.R.attr.progressBarStyleHorizontal);
       pb.setMax(GameConfig.GameSpeedMax);
       pb.setProgress(GameConfig.GameSpeedDefault);
       pb.setLayoutParams(new LinearLayout.LayoutParams(
               ExtensionLayoutConfig.ProgressBarWidth,
               LinearLayout.LayoutParams.WRAP_CONTENT));
       toast = Toast.makeText(context,
               RFileIDConvert.getString("gameSpeedBarTitle"),
               Toast.LENGTH_LONG);
       toast.setGravity(Gravity.TOP, 0, 0);
       LinearLayout toastView = (LinearLayout) toast.getView();
       toastView.setGravity(Gravity.CENTER);
       //请注意这里传1是必要的,因为他的textView已经在创建的时候添加进去了,如果你传0
       
//那么上面会先显示进度条 下面再显示文字,如果你需要的话可以这么做,但我现在需要
       
//文字在上方 进度条在下面 so 传1
       toastView.addView(pb, 1);

复制代码

 

 

下面是给外部调用的2个接口:

复制代码

    /**
    * 设置进度
   
*/

   public void setGameSpeedBarProgress(int progress) {
       pb.setProgress(progress);
   }
   /**
    * 显示toast
   
*/

   public void gameSpeedBarShow() {
       toast.show();
   }

复制代码

出来的效果是这样

发现和原来的相比没那么大气,所以还需要调整下间距,这个简单 我明天再完善它, 大概功能就是这样了。

总结。大家请不要小看这么一个界面,我刚开始也觉得很容易,可实现起来发现的问题也不少。

1.一般布局我习惯用代码布局,但碰到ProgressBar我只能无语。在代码中默认的风格是环形的,在XML布局中默认的是水平的

xml中他默认是这么设置的 <ProgressBar  style="?android:attr/progressBarStyleHorizontal"

呵呵,难点出来了,这个如果你想用代码设置的话,告诉你很抱歉没有设置风格的方法。有人会说了ProgressBar  中不是有个setScrollBarStyle(int style)方法么。

那么我请你测试完了在说话。这个方法是无效的,请看API的描述。然后我查源码想找出水平方向风格使用了那些设置接口,

我们可以看下progressBarStyleHorizontal样式中给View设置了哪些属性,我们找到framework下的res目录下的values/Theme.xml文件,搜索progressBarStyleHorizontal会发现如下行:

 <item name="progressBarStyleHorizontal">@android :style/Widget.ProgressBar.Horizontal</item>

该主题对应的Widget样式是Widget.ProgressBar.Horizontal,我们在同样的的目录下打开style.xml文件,搜索该样式,可以找到如下代码:

  <style name="Widget.ProgressBar.Horizontal">

        <item name="android:indeterminateOnly">false</item>

        <item name="android:progressDrawable">@android :drawable/progress_horizontal</item>

        <item name="android:indeterminateDrawable">@android :drawable/progress_indeterminate_horizontal</item>

        <item name="android:minHeight">20dip</item>

        <item name="android:maxHeight">20dip</item>

    </style>

好了,看到这里告诉你,你可以不使用<item name="progressBarStyleHorizontal">@android :style/Widget.ProgressBar.Horizontal</item>

而使用

android:indeterminateOnly="false"

android:progressDrawable="@android :drawable/progress_horizontal"

android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"

android:minHeight="20dip"

android:maxHeight="20dip" />

同样可以实现水平进度条。我知道大家都会使用那一行而不使用这么多行。我明白,我只是告诉你原理而已。

好的,你知道我喜欢使用代码布局的,然后走代码路线则是

复制代码

progressBar.setIndeterminate(false);

       progressBar.setProgressDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));

       progressBar.setIndeterminateDrawable(getResources().getDrawable(android.R.drawable.progress_indeterminate_horizontal));

       progressBar.setMinimumHeight(20);

复制代码

 

结果是ProgressBar确实变成了横条,但并没有显示成进度条的样子,我们仔细对比一下纯Java代码和xml布局文件之间差异,我们发现

android:indeterminateOnly="false"和 progressBar.setIndeterminate(false);

并不完全一样布局文件的属性有一个Only结尾但代码中并没有,我们查找Api发现并没有setIndeterminateOnly这样的一个方法。

我们打开ProgressBar的源代码,找到.setIndeterminate(false) 方法。

 

我们这时候可以发现Indeterminate和IndeterminateOnly并不是同一个东西,

这时我们应该想的到,只要我们把IndeterminateOnly的值变成false就可以使ProgressBar变成进度条的样式,

我们查找所有的代码,发现并没有提供相应的公开方法来修改该属性的值。

 

 

也就是说,我们讨论了那么久发现根本就无法通过纯代码的形式来创建一个水平进度条样式的ProgressBar.

但是。。。某人说可以使用反射改变一个类的私有变量的值。内容比较抽象,这里还是略过吧,因为我发现它必须知道变量名才能反射成功,

但我查询后发现有些版本的变量名是不一样的咧,这个版本用的mIndeterminateOnly,那个版本用的mOnlyIndeterminate(2.2版)

所以这个地方我果断放弃了纯代码布局,使用

ProgressBar pb = new ProgressBar(context, null,android.R.attr.progressBarStyleHorizontal);  安逸了~~~~ 这只是第一个问题哦

2.使用toast的时候需要注意,如果你需要那个背景框就必须makeToast. 如果你喜欢干净的话 可以使用new Toast(context)然后再设置一些属性之类的

如果只想要toast的短暂显示的功能,界面完全自定义的话 推荐使用new Toast(context),最后大家要养成看源码的习惯哦,有时候还是需要自己动手,

丰衣足食啊


© 著作权归作者所有

共有 人打赏支持
simpower
粉丝 24
博文 422
码字总数 20207
作品 0
海淀
程序员
布局与控件(五)-Toast吐司与布局的抽象标签merge include ViewStub

第5节 Toast 5.1 使用效果 用来向用户弹出一个提示框,然后自动消失,就像这样, 面包机烤好面包后,就腾的一下把面包从面包机里弹出来。而这个控件显示时也像是从面包机里弹出来的,所以取了...

anddlecn ⋅ 2016/06/02 ⋅ 0

Android提醒微技巧,你真的了解Dialog、Toast和Snackbar吗?

Dialog和Toast所有人肯定都不会陌生的,这个我们平时用的实在是太多了。而Snackbar是Design Support库中提供的新控件,有些朋友可能已经用过了,有些朋友可能还没去了解。但是你真的知道什么...

3kqing ⋅ 2016/09/09 ⋅ 0

Android提醒微技巧,你真的了解Dialog、Toast和Snackbar吗?

转载请注明出处:http://blog.csdn.net/guolinblog/article/details/51336415 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新。 今天给...

sinyu890807 ⋅ 2016/07/26 ⋅ 0

Android自定义Toast,并解决toast不重复显示

1、Android自带的Toast样式固定,这里我们对其简单的封装。自定义一个适应我们需求的Toast private void createToastWindow(String text) {LayoutInflater inflater = LayoutInflater.from(...

风过后 ⋅ 2015/12/10 ⋅ 0

Toast的使用详解

Android中提供一种简单的Toast消息提示框机制,可以在用户点击了某些按钮后,提示用户一些信息,提示的信息不能被用户点击,Toast的提示信息根据用户设置的显示时间后自动消失。Toast的提示信...

码农明明 ⋅ 2014/05/17 ⋅ 0

《React-Native系列》38、 ReactNative混合组件封装

在我们做ReactNative项目的过程中,我们会发现由ReactNative提供给我们的组件或API往往满足不了我们的需求,常常需要我们自己去封装Native组件。 今天我们介绍下如果封装一个简单的ReactNati...

hsbirenjie ⋅ 2016/10/11 ⋅ 0

开源中国 OsChina Android 客户端源码分析(10)双击退出程序

在源码中,火蚁完全封装了 双击退出程序的功能 : DoubleClickExitHelper类 该类的源码分析如下: 1 构造函数中传入了 设备上下文,实现退出功能的界面,完成消息处理器的初始化;既然要有提...

姬鑫 ⋅ 2015/11/02 ⋅ 1

Android 给Button加个监听

在Android开 发过程中,Button是常用的控件,用起来也很简单,你可以在界面xml描述文档中定义,也可以在程序中创建后加入到界面中,其效果都是一样的。不过最 好是在xml文档中定义,因为一旦...

wuwulh ⋅ 2010/08/23 ⋅ 2

Andorid 应用内悬浮控件实践方案总结

本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。 在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 这里写图片描述 首先想到的是申请悬浮窗权限,OK~ 打...

王英豪 ⋅ 2017/11/16 ⋅ 0

Android基础 : Android Service[转]

很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。 为了处理这种后台进程,Android引入了Service的概念。...

kevin.gan ⋅ 2010/01/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 29分钟前 ⋅ 0

前阿里P8架构师:精准定制Java架构师学习计划!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握J...

java高级架构牛人 ⋅ 32分钟前 ⋅ 0

zookeper学习

https://blog.csdn.net/u012152619/article/category/6470028

~少司命~ ⋅ 33分钟前 ⋅ 0

Spring MVC ,JSON,JQuery,不懂JQuery,跳过了

/spring-mvc-study/src/main/webapp/course_json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD ......

颖伙虫 ⋅ 34分钟前 ⋅ 0

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

阿里云云栖社区 ⋅ 34分钟前 ⋅ 0

mahout demo

package com.datamine.CollaborativeFiltering.mysql; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommend......

xiaomin0322 ⋅ 36分钟前 ⋅ 0

red hat openstack 12配置要求

安装 openstack 之前,一般要规划整个系统中,到底要多少台机器来参与openstack, 根据rhosp12的官方文档: 最低要求是3台物理机,1台作为director,一台作为 controller ,一台作为computer....

tututu_jiang ⋅ 37分钟前 ⋅ 0

Rocket-Chip在GitHub上的各个源码

在github上通过搜索Rocket-chip可以得到36个结果:其中 https://github.com/freechipsproject/rocket-chip https://github.com/ucb-bar/riscv-boom https://github.com/ucb-bar/fpga-zynq (......

whoisliang ⋅ 42分钟前 ⋅ 0

【HAVENT原创】CentOS 6.5 下 Nginx 的安装与配置

nginx是轻量级的Web服务器、反向代理服务器及邮件服务器,具有占用内存少,并发能力强的优点,已被广泛应用。本文介绍目前最新版本 1.12.2 的安装。 各版本nginx下载地址:http://nginx.org/...

HAVENT ⋅ 48分钟前 ⋅ 0

查看linux系统重启之前的log -- last_kmsg

当 Linux Kernel 出现 BUG 的时候,后走入 panic flow,这个时候由于 Kernel 出现了严重的问题,adbd 也无法响应 adb 连接请求,这个时候想透过读取 Kernel Log Buffer 来看 Kernel Log 是不...

zyzzu ⋅ 49分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部