- 浏览: 637501 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
在andriod开发中,很大一部分都要与资源打交道,比如说:图片,布局文件,字符串,样式等等。这给我们想要开发一些公共的组件带来很大的困难,因为公共的组件可能更愿意以jar包的形式出现。但是java的jar包中只允许出现java代码而不能出现资源。
当我们想要以jar包的形式提供我们自己开发的公共组件时,我们就需要把以代码的形式创建资源。
下面提供一个使用全Java代码的形式创建一个ProgressBar。
ProgressBar默认的样式是一个圈圈,我们要想其显示为进度条的样式可以在布局文件中使用如下代码:
<ProgressBar android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal" />
上面的关键代码是红色的部分,这部分的代码就是使得ProgressBar由转圈圈的样式变成进度条的样式。使用这种方式创建的ProgressBar不能包含在jar包中。
同样我们也可以使用纯代码的形式创建ProgressBar对象,如下:
...
ProgressBar progressBar = new ProgressBar(context);
LineanerLayout layout = new LinearLayout(context);
layout.addView(progressBar, new LayoutParam(LayoutParam.FILL_PARENT, LayoutParam.FILL_PARENT));
....
这样就使用纯代码的方式创建了一个ProgressBar对象,但是他还只是默认的样式一个不停的转的圈圈。
这时我们可能都会想到好像没有设置样式。我们可以把之前的那个样式设进去,但是我们找遍API发现View并没有提供任何给我们设置样式的方法。
其实样式就是通过一种方式给一个View或一组View设置一些共同的属性值,所以不可能能使用代码来设置。
我们可以看下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.
但是。。。
不就是改变一个类的私有变量的值嘛,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的进度条样式。
ProcessBar的使用:
public class ProcessActivity extends Activity { private ProgressBar psb_sec; private Button btn_process; private static final int PSB_MAX = 100; private static int process; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); psb_sec = (ProgressBar) findViewById(R.id.psb_sec); psb_sec.setMax(100); btn_process = (Button) findViewById(R.id.btn_process); btn_process.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(process < PSB_MAX){ psb_sec.setProgress(process); process += PSB_MAX/10; psb_sec.setSecondaryProgress(process); return; } psb_sec.setVisibility(View.INVISIBLE); } }); } }
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1469当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 22011.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1637刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 1036从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2485android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1560F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1167添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1179declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5314如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1080从 Java 5 开始,Java 提供了自己的线程池。线 ... -
android应用检测更新代码
2012-09-24 17:40 1852JAVA代码: UpdateManager.java ... -
adb命令详解
2012-09-19 15:04 2892Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1655public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1649使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10088PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 907这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9711.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1124在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1056public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1942首先呢,我们还是看几个示图:(这是360推出的一款天气预 ...
相关推荐
本示例探讨的是如何使用纯Java代码创建ProgressBar,而不是借助XML布局文件来实现这一功能。 首先,我们需要了解ProgressBar的基本使用。在Android中,ProgressBar有两种类型:水平和旋转(indeterminate)。水平...
ProgressBar的基本使用非常简单,只需在布局文件中添加一个ProgressBar标签,设置其属性,如id、style、max等。例如: ```xml <ProgressBar android:id="@+id/progressBar" style="?android:attr/...
在本案例中,"android progressBar test"很可能是一个示例项目,用于展示如何在Android应用中使用和测试Progressbar的各种功能。 Progressbar在Android中有两种主要类型:LinearProgressBar和CircularProgressBar...
本篇文章将深入探讨如何在Android中使用ProgressBar以及自定义其样式。 首先,ProgressBar的基本用法是在XML布局文件中声明它。以下是一个简单的例子: ```xml <ProgressBar android:id="@+id/progressBar" ...
在Android开发中,ProgressBar是一个非常常见的组件,用于展示任务的进度或者表示正在执行的操作。本篇文章将深入探讨如何自定义ProgressBar以满足特定的设计需求,尤其是根据系统的风格进行定制,包括改变默认背景...
2. **代码创建ProgressBar**: 在Activity或Fragment的Java/Kotlin代码中,先实例化一个ProgressBar对象。例如: ```java ProgressBar progressBar = new ProgressBar(context); ``` 然后设置其属性,如样式、...
总结来说,自定义一个基于逐帧动画的ProgressBar组件,涉及到的主要知识点有:ProgressBar组件的使用、动画资源的创建、XML布局文件的编写以及在Java代码中的动画控制。通过这样的实践,开发者可以更好地理解Android...
在XML布局文件中,你需要定义一个`ProgressBar`,可以设置其样式、最大值、当前值等属性。例如: ```xml <ProgressBar android:id="@+id/progressBar" android:layout_width="wrap_content" android:layout_...
在Android开发中,ProgressBar是一个非常重要的组件,它用于显示进度状态,可以是确定性的,...这个例子展示了如何在Android应用中创建和控制一个基本的ProgressBar,通过查看源代码,你可以更深入地理解其工作原理。
在Android开发中,ProgressBar是一个非常常见的组件,用于展示任务的执行进度,比如文件...在ProgressBar-master这个项目中,可能包含了更多关于自定义进度条样式的示例代码,可以参考学习以提升你的Android开发技能。
通过修改ProgressBar的style属性或者创建自定义样式,可以改变进度条的颜色、大小等外观特性。 在Android Studio的项目中,"Mytest008"可能代表了一个示例工程,其中包含了实现上述步骤的具体代码。如果你在实际...
然后,在Java或Kotlin代码中,我们可以像操作普通Progress Bar一样操作这个自定义的Progress Bar,例如设置进度: ```java ProgressBar customProgressBar = findViewById(R.id.custom_progress_bar); ...
你可以通过`NotificationChannel`来控制通知的各种属性,并在`NotificationManager`中创建和发布通知。例如: ```java NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "CHANNEL_NAME", ...
对于水平进度条,可以通过设置`android:max`属性来定义最大值,并通过`android:progress`或在代码中动态设置`setProgress()`来调整当前进度。例如,设置最大值为100,初始进度为50: ```xml <ProgressBar android:...
在`AndroidManifest.xml`文件中,你可以为ProgressBar设置属性,比如android:visibility来控制其可见性,或者android:indeterminate来指定是否使用不确定模式。同时,你还可以通过style属性应用自定义的主题。 在`...
2. 在代码中获取ProgressBar实例并设置进度: ```java ProgressBar progressBar = findViewById(R.id.progressBar); progressBar.setProgress(50); // 设置进度为50% ``` 对于更复杂的定制,可以通过以下方式实现:...
在Android 2.3版本中,开发者可以使用ProgressBar来为用户创建直观的等待反馈,增强用户体验。本篇文章将深入探讨如何在Android 2.3环境下有效地使用ProgressBar控件。 首先,ProgressBar分为两种主要类型:水平...
本项目是一个针对初学者的`ProgressBar`初步学习实例,旨在帮助开发者理解如何在Android应用中集成和使用`ProgressBar`。 `ProgressBar`的基本使用: 1. **XML布局文件中的声明**:在`res/layout`目录下的XML布局...
在Java代码中,可以通过`ProgressBar`对象的`setProgress()`方法来改变进度: ```java progressBar.setProgress(value); progressBar.setMax(maxValue); ``` 5. **AsyncTask与ProgressBar** 当进行耗时操作时...
3. **代码中使用**:在Activity或Fragment的Java/Kotlin代码中,找到对应的`ProgressBar`实例并设置可见或隐藏,根据需要启动或停止动画。 ```java ProgressBar progressBar = findViewById(R.id.progress_bar); ...