`
buddie
  • 浏览: 182653 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于使用代码创建ProgressBar

阅读更多

在自己的项目中,遇到了代码创建ProgressBar,无法更改样式等问题。在交流群里,也有人问过!

今天我就结合我查的资料和大家交流一下。

 

ProgressBar mProgressBar=new ProgressBar(context);
this.addView(mImageView,0);

 

 这样,可以用代码创建一个ProgressBar,可是怎么把的样式改成横条状呢?

在使用XML文件来布局时,会使用style来设置:

 

style="?android:attr/progressBarStyleHorizontal"

 

 可是我们有代码怎么来设置呢?没ProgressBar.setStyle()方法啊!

查了一下高手写的文章,了理到从源码中可以看出progressBarStyleHorizontal也是一个布局罢了

源码如下:

 

<ProgressBar android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:indeterminateOnly="false"

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

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

android:minHeight="20dip"

android:maxHeight="20dip" />
 

 

 

我们可以通过代码来设置:

 

mProgressBar.setIndeterminate(false);
mProgressBar.setProgressDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
mProgressBar.setIndeterminateDrawable(getResources().getDrawable(android.R.drawable.progress_indeterminate_horizontal));

 这样就可以实现ProgressBar的条状布局了!

可这时,我们又会发现ProgressBar的进度,无法刷新

原因是XML文件中的android:indeterminateOnly="false"和 代码中的progressBar.setIndeterminate(false)并不完全一样。布局文件的属性有一个Only结尾但代码中并没有,而查找Api发现并没有setIndeterminateOnly这样的一个方法。

看一下ProgressBar的源码我们会发现ProgressBar中有两个私有变量:mOnlyIndeterminate和mIndeterminate。而程序没有提供设置mOnlyIndeterminate的方法。

这里我们可以使用Java的反射机制来设置。

我们写一个通用的BeanUtils类来进行反射操作:

 

public class BeanUtils {
    private BeanUtils() {

    }

    /**
     * 直接设置对象属性值,无视private/protected修饰符,不经过setter函数.
     */
    public static void setFieldValue(final Object object, final String fieldName, final Object value) {
        Field field = getDeclaredField(object, fieldName);
        if (field == null)
            throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");
        makeAccessible(field);
        try {
            field.set(object, value);
        } catch (IllegalAccessException e) {
        Log.e("zbkc", "", e);
        }
    }

    /**
     * 循环向上转型,获取对象的DeclaredField.
     */
    protected static Field getDeclaredField(final Object object, final String fieldName) {
        return getDeclaredField(object.getClass(), fieldName);
    }

    /**
     * 循环向上转型,获取类的DeclaredField.
     */
    @SuppressWarnings("unchecked")
    protected static Field getDeclaredField(final Class clazz, final String fieldName) {
        for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {
            try {
                return superClass.getDeclaredField(fieldName);
            } catch (NoSuchFieldException e) {
                // Field不在当前类定义,继续向上转型
            }
        }
        return null;
    }

    /**
     * 强制转换fileld可访问.
     */
    protected static void makeAccessible(Field field) {
        if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) {
            field.setAccessible(true);
        }
    }
}
 

 

 

然后,我们在创建ProgressBar的地方使用下面的语句设置mOnlyIndeterminate为false

 

BeanUtils.setFieldValue(mProgressBar, "mOnlyIndeterminate", new Boolean(false));

 

 这样就实现了用代码来创建ProgressBar。

下面是我的代码

 

super(context);
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
ProgressBar mProgressBar=new ProgressBar(context);
BeanUtils.setFieldValue(mProgressBar, "mOnlyIndeterminate", new Boolean(false));
mProgressBar.setIndeterminate(false);
mProgressBar.setProgressDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
mProgressBar.setIndeterminateDrawable(getResources().getDrawable(android.R.drawable.progress_indeterminate_horizontal));
mProgressBar.setLayoutParams(new FrameLayout.LayoutParams(65, 5, Gravity.CENTER_VERTICAL) );
this.addView(mProgressBar,0);

 如果大家有更好的方法,希望大家能给我留言!

 

分享到:
评论
4 楼 buddie 2015-02-25  
380226205 写道
二楼能直接解决问题,楼主的代码有bug,不知道哪儿copy过来的。

hyp712 写道
ProgressBar progressBar = new ProgressBar(mContxt, null, android.R.attr.progressBarStyleHorizontal);
这样就可以了。
不过,楼主大哥碉堡,那一番代码给力!

本文基于11年的Android版本,现在随着Android系统的升级,该文章已不再适用,请读者不要再以本文做为参考。
本文不删除,是本人希望留做纪念。
3 楼 380226205 2014-12-12  
二楼能直接解决问题,楼主的代码有bug,不知道哪儿copy过来的。
2 楼 hyp712 2014-02-17  
ProgressBar progressBar = new ProgressBar(mContxt, null, android.R.attr.progressBarStyleHorizontal);
这样就可以了。
不过,楼主大哥碉堡,那一番代码给力!
1 楼 dxawmhmy 2012-12-12  

厉害!

相关推荐

    纯Java代码创建ProgressBar,不使用xml

    纯Java代码创建ProgressBar,不使用xml布局文件,代码解读http://blog.csdn.net/codehxy/article/details/30744439

    android studio创建android项目(10)——ProgressBar的使用-附件资源

    android studio创建android项目(10)——ProgressBar的使用-附件资源

    Android编程入门很简单.(清华出版.王勇).part2

    7.1.2使用代码创建布局 7.2使用布局类 7.2.1使用绝对布局 7.2.2使用线性布局 7.2.3使用框架布局 7.2.4使用表格布局 7.2.5使用关系布局 7.3使用其他布局容器 7.3.1 使用TabActivity 7.3.2 自定义TabHost 7.3.3 使用...

    Android编程入门很简单.(清华出版.王勇).part1

    7.1.2使用代码创建布局 7.2使用布局类 7.2.1使用绝对布局 7.2.2使用线性布局 7.2.3使用框架布局 7.2.4使用表格布局 7.2.5使用关系布局 7.3使用其他布局容器 7.3.1 使用TabActivity 7.3.2 自定义TabHost 7.3.3 使用...

    《android编程入门经典》书籍源代码

    ◆ 描述了在使用TextView、ProgressBar、AutoComplete- TextView、TimePicker、ListView等视图设计用户界面时 涉及的元素 ◆ 演示了如何使用视图显示图片和菜单 ◆ 讲解了如何使用内容提供者和如何创建自己的...

    Access+2000中文版高级编程

    1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏命令等价的代码 7 1.3 将现有宏转换为代码 8 1.4 小 结 12 第2章 使用VBA...

    Access 2000中文版高级编程(part1)

    1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏命令等价的代码 7 1.3 将现有宏转换为代码 8 1.4 小 结 12 第2章 使用VBA编写代码 ...

    wpf源码大全 精通C#3.0图书源码 详细源码 学习好用

    UnderstandXAMLDemo2 使用程序代码创建UI元素。 XAMLEvents 在XAML中使用事件。 XamlReaderDemo 动态加载和编译XAML示例。 第9章(\C09) 示例描述:本章详细介绍WPF中的全局应用程序类Application。 ...

    Android实例代码

    5.3、使用Intent创建Tab页面: 第6章、Android应用的资源 6.1、资源的类型及存储方式: 6.2、使用字符串、颜色、尺寸资源: 6.3、数组资源: 6.4、使用Drawable资源:图片资源; StateListDrawable资源; ...

    疯狂Android讲义源码

     2.5.3 使用AlertDialog创建自定义  对话框 116  2.5.4 使用PopupWindow 121  2.5.5 使用DatePickerDialog、TimePickerDialog 123  2.5.6 使用ProgressDialog创建进度  对话框 125  2.6 消息提示 127  2.6.1...

    Android入门到精通源代码.

    2.5.1 使用Eclipse创建Android项目 2.5.2 Eclipse中Android项目架构 2.5.3 Eclipse中Android项目的调试和运行 第3章 Android中的Activity 3.1 Activity的作用 3.2 单Activity的Android应用 3.2.1 Activity的生命周期...

    疯狂Android讲义.part2

    2.5.6 使用ProgressDialog创建进度 对话框 125 2.6 消息提示 127 2.6.1 使用Toast显示提示信息框 128 2.6.2 Notification的功能与用法 129 2.7 菜单 132 2.7.1 选项菜单和子菜单 (SubMenu) 132 2.7.2 使用监听器来...

    疯狂Android讲义.part1

    2.5.6 使用ProgressDialog创建进度 对话框 125 2.6 消息提示 127 2.6.1 使用Toast显示提示信息框 128 2.6.2 Notification的功能与用法 129 2.7 菜单 132 2.7.1 选项菜单和子菜单 (SubMenu) 132 2.7.2 使用监听器来...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    5.3、使用Intent创建Tab页面: 第6章、Android应用的资源 6.1、资源的类型及存储方式: 6.2、使用字符串、颜色、尺寸资源: 6.3、数组资源: 6.4、使用Drawable资源:图片资源; StateListDrawable资源; ...

    WPF编程宝典 part1

    8.1.4 使用代码创建绑定 205 8.1.5 使用代码检索绑定 206 8.1.6 多绑定 207 8.1.7 绑定更新 210 8.1.8 绑定延迟 211 8.2 绑定到非元素对象 211 8.2.1 Source属性 212 8.2.2 RelativeSource属性 212 8.2.3 ...

    Visual C# 2005程序设计自学手册 随书源码第一部分(共三部)

    10.2.2 “关于”对话框的使用 228 10.3 公共对话框 230 10.3.1 “打开”对话框的使用 230 10.3.2 “另存为”对话框的使用 233 10.3.3 “颜色”对话框的使用 235 10.3.4 “字体”对话框的使用 238 10.3.5...

    WPF编程宝典 part2

    8.1.4 使用代码创建绑定 205 8.1.5 使用代码检索绑定 206 8.1.6 多绑定 207 8.1.7 绑定更新 210 8.1.8 绑定延迟 211 8.2 绑定到非元素对象 211 8.2.1 Source属性 212 8.2.2 RelativeSource属性 212 8.2.3 ...

    c# 加密和解密相关代码

    本实例使用了“异或”运算符,但是在使用“异或”运算符之前,有必要了解“异或”运算符所做的“异 或”运算的机制,“异或”运算符“^”用于比较两个二进制数的相应位。在执行按位“异或”运算时,如果两 个二进制...

Global site tag (gtag.js) - Google Analytics