Android 在Java代码中设置style属性--使用代码创建ProgressBar对象(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

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.

但是。。。

不就是改变一个类的私有变量的值嘛,Java的封装性其实并没有我想的那么好,我们完全可以通过反射机制来修改一个对象的私有变量的值,由于该文章并不是讨论反射的的文章,所以这里只给出通过反射来修改私有变量值的代码,但并不作详细的说明:

我们创建一个新的类,叫BeanUtils.java

类得内容看其来如下:

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

}

}

}

该工具提供一个共有的方法:public static void setFieldValue(final Object object, final String fieldName, final Object value)来修改一个对象的私有变量的值:

这时我们的ProgressBar代码看起来应该如下:

ProgressBar progressBar = new ProgressBar(this);

BeanUtils.setFieldValue(progressBar, “mIndeterminateOnly”, new Boolean(false));

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);
到此为止我们终于使用纯java代码的方式创建了一个ProgressBar的进度条样式。
转载自:http://hi.baidu.com/xiaofanqing/item/52fb162831284cf850fd87b5

最后

金三银四到了,送上一个小福利!

image.png

image.png

专题+大厂.jpg

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

g-sKV4Ns9w-1713670375351)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-BjTg5KXg-1713670375352)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值