首先我需要这样一个界面

这个界面是在使用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),最后大家要养成看源码的习惯哦,有时候还是需要自己动手,丰衣足食啊

使用android ProgressBar和Toast生成一个界面的更多相关文章

  1. 中级实训Android学习记录——Toast、AlertDialog、ProgressBar

    学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...

  2. Android - 返回上一个界面finish()方法

    返回上一个界面finish()方法 本文地址: http://blog.csdn.net/caroline_wendy Android能够使用finish()方法,实现函数返回的功能.当不是Activ ...

  3. 三张图教你生成一个Android jar 库。

    我看到非常多教人使用第三方开源组件的Android教程.都是在教基于源代码project的库导入,个人觉得非常不妥,觉得最恰当的方式是把源代码project生成一个jar再导入到目标project上使 ...

  4. Android Toast:是一个类,主要管理消息的提示

    Toast:是一个类,主要管理消息的提示.makeText(),是Toast的一个方法,用来显示信息,分别有三个参数.第一个参数:this,是上下文参数,指当前页面显示第二个参数:“string st ...

  5. android 永不关闭toast

    Toast信息提示框之所以在显示一定时间后会自动关闭,是因为在系统中有一个Toast队列;那么有些时候需要这个Toast信息提示框长时间显示,直到需要关闭它时通过代码来控制,而不是让系统自动来关闭To ...

  6. 参考_Android中,如何新建一个界面,并且实现从当前界面切换到到刚才新建的(另外一个)界面

    参考地址: http://www.crifan.com/android_how_to_create_new_ui_and_switch_to_another_new_ui/ 想要实现,在Android ...

  7. android 二维码生成+扫描

    android 二维码生成+扫描 1.在Android应用当中,很多时候都要用到二维码扫描,来避免让用户手动输入的麻烦. Google官方自己推出了一个二维码开源项目:ZXing库. 2.这里简单介绍 ...

  8. Android:仿微信开场切换界面

    这实例很多人仿做,好实例还是不容错过!最重要是素材容易拿~ 效果: 默认3页面的切换,最后一个页面带按钮,点击进入另外一个页面 思路: 1.准备5个布局页面,1个为主函数布局页面,3个为切换的页面(其 ...

  9. Android研究之动态创建UI界面具体解释

     Android的基本UI界面一般都是在xml文件里定义好,然后通过activity的setContentView来显示在界面上.这是Android UI的最简单的构建方式.事实上,为了实现更加复 ...

随机推荐

  1. ios 后台播放音乐1条注意事项

    除了设置程序的后台模式,还需要几行代码 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory: ...

  2. ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

    一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...

  3. MVP设计模式的实现

    MVP:界面与业务逻辑分离在Winform中的应用 MVP,Model-View-Presenter的缩写. 在MSDN上,下载了一个示例,http://www.microsoft.com/china ...

  4. linux 用户、用户组不能是全数字

    今天封装命令行,需要创建用户.用户组,遇到下面问题,如图: 当时我和迷茫,为什么明明存在‘1111’这个用户组,但是却提示不存在呢??难道是linux的一个bug??? 接着我又试了几个: 发现规律了 ...

  5. August 19th 2016 Week 34th Friday

    Friends are not the people you meet at the top, they are the people who were with you at the bottom. ...

  6. 简易qq对话框

    //本程序由QT5 creator编译可运行 //dialog.h 1 #ifndef DIALOG_H #define DIALOG_H #include <QDialog> class ...

  7. Navicat 回复 psc 文件 Mysql

    在mysql 中回复 psc文件 的时候 只能一步步来,先在navicat中建一个空数据库,然后点击有上角的备份==>回复备份==> 找到psc文件==> 注意此时不要急于点击 开始 ...

  8. iOS - OC/Swift:验证手机号/固话用正则表达式

    /** * 验证手机号是否正确 * @param unknown_type $mobile */ OC: - (BOOL)isMobileNumber:(NSString *)mobileNum { ...

  9. NYOJ题目1045看美女

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAK5CAIAAADCdSR7AAAgAElEQVR4nO3dP3Lbuv434HcT7r2Q1F

  10. centos 安装 py pyhs2

    1. yum install gcc-c++ cyrus-sasl-develpip2.7 install pyhs2 --->好像不行,在试试 用于 hive thrift 访问 2. os. ...