Android Java代码中设置style属性--创建ProgressBar对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012971339/article/details/46742243



在写webview的时候   在界面好看的原则下  最终写了自带

ProgressBar的webview

那么问题就来了  webview都是java代码  你不能progressbar是xml吧  所以就开始了progressbar的java编写之路  但是发现蛋疼之处还是有的

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

我们可以看下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> 

 

也就是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" /> 

 

这时运行我们的程序,发现ProgressBar已从圈圈变成进度条的样式。这时我们可以在代码中把这些属性设成布局文件中的值,纯Java代码看起来应该如下面的那样:

ProgressBar progressBar = new ProgressBar(this); 

 

        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); 

 

 

 

        LinearLayout layout = new LinearLayout(this); 

 

        layout.addView(progressBar, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

 

        setContentView(layout); 

 

这时我们发现ProgressBar确实变成了横条,但并没有显示成进度条的样子,我们仔细对比一下纯Java代码和xml布局文件之间差异,我们发现 android:indeterminateOnly="false"和 progressBar.setIndeterminate(false);并不完全一样布局文件的属性有一个Only结尾但代码中并没有,我们查找Api发现并没有setIndeterminateOnly这样的一个方法。 

 

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

 

 

 

 

 public synchronized void setIndeterminate(boolean indeterminate) { 

 

        if ((!mOnlyIndeterminate || !mIndeterminate) && indeterminate != mIndeterminate) { 

 

            mIndeterminate = indeterminate; 

 

 

 

            if (indeterminate) { 

 

                // swap between indeterminate and regular backgrounds 

 

                mCurrentDrawable = mIndeterminateDrawable; 

 

                startAnimation(); 

 

            } else { 

 

                mCurrentDrawable = mProgressDrawable; 

 

                stopAnimation(); 

 

            } 

 

        } 

 

    } 

 

我们这时候可以发现Indeterminate和IndeterminateOnly并不是同一个东西,这时我们应该想的到,只要我们把 IndeterminateOnly的值变成false就可以使ProgressBar变成进度条的样式,我们查找所有的代码,发现并没有提供相应的公开方法来修改该属性的值。 

 

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

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

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

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

ProgressBar pb = new ProgressBar(context, null,android.R.attr.progressBarStyleHorizontal);  



博文是百度搜到的  博文的集合  整理一下作为自己的知识储备



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页