在自己的项目中,遇到了代码创建ProgressBar,无法更改样式等问题。在交流群里,也有人问过!
今天我就结合我查的资料和大家交流一下。
ProgressBar mProgressBar=new ProgressBar(context); this.addView(mImageView,0);
这样,可以用代码创建一个ProgressBar,可是怎么把的样式改成横条状呢?
在使用XML文件来布局时,会使用style来设置:
可是我们有代码怎么来设置呢?没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。
下面是我的代码
1 什么是回调
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在不同软件架构中的实现。
1、安装98教程:
1论坛搜S60的DosBox完全版
先安装install里的驱动文件,再安装dosbox full在手机c盘
2下载windows98的镜像文件,解压img文件放在e:\dos\windows (没有自建)
3下载配置文件放在e:\data文件夹下
4运行dosbox自启动windows出 现98视窗徽标!
5硬盘自检后进入桌面
6等完全载入后通话键可以切换方向键鼠标操作选择键为鼠标左键
windows98 img文件地址http://www.rayfile.com/files/e2e3c8e3-b500-11de-8191-0014221b798a/ 81.9M
windows95img文件地址:http://www.rayfile.com/files/64c4cb8c-b500-11de-8247-0014221b798a/ 44.6M
2、画面
还有人在里面玩CS2.6版本的,实在是牛啊,够折腾人的。