`
buddie
  • 浏览: 185563 次
  • 性别: 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布局文件来实现这一功能。 首先,我们需要了解ProgressBar的基本使用。在Android中,ProgressBar有两种类型:水平和旋转(indeterminate)。水平...

    Android 动态生成 步骤 ProgressBar

    2. **代码创建ProgressBar**: 在Activity或Fragment的Java/Kotlin代码中,先实例化一个ProgressBar对象。例如: ```java ProgressBar progressBar = new ProgressBar(context); ``` 然后设置其属性,如样式、...

    Android应用源码之ProgressBar 几乎全部的用法

    ProgressBar的基本使用非常简单,只需在布局文件中添加一个ProgressBar标签,设置其属性,如id、style、max等。例如: ```xml &lt;ProgressBar android:id="@+id/progressBar" style="?android:attr/...

    Progressbar进度条的使用

    在Android Studio中,我们可以通过XML布局文件来创建`ProgressBar`。 首先,在布局文件中添加`ProgressBar`元素: ```xml &lt;ProgressBar android:id="@+id/progressBar" android:layout_width="wrap_content" ...

    C#下ProgressBar详细使用方法

    或者在代码中使用以下方式动态创建: ```csharp ProgressBar progressBar1 = new ProgressBar(); this.Controls.Add(progressBar1); ``` 二、设置ProgressBar属性 1. **Minimum** 和 **Maximum**: 这两个属性定义...

    android progressbar使用系列集合

    这个文件可能包含了一个自定义的ProgressBar类,通过扩展`ProgressBar`并覆盖其`onDraw()`方法来实现自定义的绘制逻辑,或者它可能包含了一个布局文件,展示了如何在XML中使用上述方法自定义ProgressBar。...

    android实现自定义ProgressBar

    1. 创建自定义View类:创建一个新的Java类,继承自android.widget.ProgressBar。这个类将作为自定义进度条的基础,我们需要在这个类中重写一些关键方法。 2. 设计UI:自定义进度条的外观通常通过XML布局文件实现。...

    Android 之 ProgressBar用法介绍

    本篇文章将深入探讨ProgressBar的使用方法,包括其基本用法、样式定制以及自定义实现。 首先,ProgressBar有三种基本样式:Horizontal(水平)、Circular(圆形)和Indeterminate(不确定)。Horizontal ...

    Android之自定义ProgressBar

    创建一个继承自ProgressBar的Java类,例如`CustomProgressBar.java`。在这个类中,我们可以覆盖父类的方法,添加自定义的功能和逻辑。比如,重写`onDraw()`方法,绘制自己的进度条样式。 ```java public class ...

    ProgressBar的使用

    在Android开发中,ProgressBar的使用广泛,无论是文件下载、数据加载还是长时间运算,都可以用到它来提升用户体验。本教程将深入探讨ProgressBar的使用方法。 首先,ProgressBar分为两种类型:水平进度条...

    WPF中使用ProgressBar实现垂直温度计效果

    在本教程中,我们将探讨如何利用ProgressBar控件来创建一个垂直的温度计效果,以实现一个自定义且美观的UI元素。 首先,我们需要理解ProgressBar的基本属性和样式。ProgressBar有两个关键属性:`Value` 和 `Maximum...

    Android progressBar的简单使用例子

    在Android开发中,ProgressBar是一个非常重要的组件,它用于显示进度状态,可以是确定性的,...这个例子展示了如何在Android应用中创建和控制一个基本的ProgressBar,通过查看源代码,你可以更深入地理解其工作原理。

    Android中使用ProgressBar实现进度条

    本篇文章将深入探讨如何在Android中使用ProgressBar以及自定义其样式。 首先,ProgressBar的基本用法是在XML布局文件中声明它。以下是一个简单的例子: ```xml &lt;ProgressBar android:id="@+id/progressBar" ...

    ProgressBar

    本Demo代码就是关于如何自定义ProgressBar的一个实例。 首先,自定义ProgressBar通常涉及以下几个方面: 1. **绘制过程**:自定义ProgressBar的核心在于重写`onDraw()`方法。在这个方法里,你需要通过Canvas来绘制...

    android ProgressBar 全部的用法

    通过在代码中设置`ProgressBar.setIndeterminateDrawable()`,可以使用自定义的无限循环动画,增强用户体验。 七、使用ProgressBar与Notification 在通知栏中也可以使用ProgressBar,通过NotificationCompat....

    Android使用ImageView仿照ProgressBar旋转效果

    然而,有时候我们可能希望创建一种自定义的效果,比如让一个ImageView模仿ProgressBar的旋转动画。这个需求可以通过结合使用ImageView和AnimationDrawable来实现,这是一种轻量级且灵活的方式。 首先,我们来理解这...

    WPF ProgressBar的使用示例

    本示例将探讨如何在多线程环境中使用WPF的ProgressBar来更新进度值,特别是在后台任务执行时,确保用户界面(UI)保持响应。 在传统的单线程应用中,如果长时间运行的任务在主线程上执行,UI会变得无响应,导致用户...

    Android代码-一个可以定制进度动画的ProgressBar

    在Android开发中,ProgressBar是用于显示进度或等待状态的基本组件,它为用户提供了可视化的反馈。本项目"AnimProgressBar"专注于提供一个可自定义动画效果的ProgressBar,这为开发者提供了更多的设计自由度,以增强...

    android关于ProgressBar和ProgressDialog的使用

    要实现这一功能,你需要在XML布局文件中定义一个`ProgressBar`,然后在Java或Kotlin代码中通过`setVisibility()`方法切换其可见性。 ```xml &lt;ProgressBar android:id="@+id/progress_bar" android:layout_width=...

    带动画的横向ProgressBar

    总结来说,“带动画的横向ProgressBar”是一种增强用户体验的UI设计,通过自定义ProgressBar和使用Android的动画框架,我们可以创建出各种独特的视觉效果。无论是从布局设计、代码实现还是性能优化的角度,理解和...

Global site tag (gtag.js) - Google Analytics