Archive for 八月 2012

Android开发 通过字符串变量名获取资源ID

情景:有几十张图片,存放在drawable目录下,通过Web Service可以取到要显示的图片文件名,通过这个文件名,来展示相应的图片。
两种方法:第一种是最笨的,写几十个if,else if,对比返回的文件名,确定要显示的图片的Resources ID.
第二种方法,用反射,这里介绍的就是第二种方法。
当我们在drawable目录下添加图片时,ADT会自动以该图片的文件名(不包括扩展名)为静态变量名,建立索引,打开gen目录下的R.java文件,可以发现,所有图片的索引都是R.drawable类下的静态变量。
我们就可通过Web Service返回的文件名(当然,要去掉扩展名的),用Java的反射机制,取到该静态变量的值,就是Resources ID,这样我们在程序中就可以直接使用了。 Continue reading ‘Android开发 通过字符串变量名获取资源ID’ »

Android开发 Activity通过AIDL与Service通讯 实现进程间通讯

AIDL全称Android Interface Definition Language,即Android接口定义语言,通过它可以在进程间通讯,今天的例子演示的是在Activity与Service间通讯。
程序结构:
包com.example.aidl中有五个文件
AIDLService.java: Service
MainActivity.java: 第一个Activity,在这里启动Service,并与之通讯
People.java: JavaBean,两字段,name,age,一方法say
SecondActivity.java: 第二个Activity,与在MainActivity中启动的AIDLService通讯
PeopleAIDL.aidl AIDL定义文件,其实就是一个Interface,但扩展名不是java,添加这个文件后,在gen目录下会自动生成PeopleAIDL.java.
本例使用了AndroidAnnotations框架,没接触过的童鞋可能会看不太懂,但其实这个框架也蛮简单的,参考前文AndroidAnnotations框架@Ebean,@RootContext,@Background,@UiThread,@AfterInject,@AfterTextChange标签的使用方法,一看就明白。
Continue reading ‘Android开发 Activity通过AIDL与Service通讯 实现进程间通讯’ »

AndroidAnnotations框架@Ebean,@RootContext,@Background,@UiThread,@AfterInject,@AfterTextChange标签的使用方法

使用@EBean的JavaBean,能直接取到调用他的Context,支持@ViewById标签找到控件,因此,构造方法传过来的参数可以少很多。 Continue reading ‘AndroidAnnotations框架@Ebean,@RootContext,@Background,@UiThread,@AfterInject,@AfterTextChange标签的使用方法’ »

Android开发 使用AndroidAnnotations快速开发应用

AndroidAnnotations是一个第三方框架,通过注释来开发应用。使用AndroidAnnotations能大大减少代码量。
上个最简单的例子,在Eclipse中新建Android项目会自动生成一个Hello World的Activity,下面的例子是修改TextView的Text属性。


package com.example.androidannotations;
import android.app.Activity;
import android.widget.TextView;

import com.googlecode.androidannotations.annotations.AfterViews;
import com.googlecode.androidannotations.annotations.EActivity;
import com.googlecode.androidannotations.annotations.ViewById;

//Eactivity注释可以设置Layout,相当于setConentView方法
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
	//ViewById注释功能与findViewById相同,如果声明的变量名就是id,可以省去参数,否则应加上id,如ViewById(R.id.tv)
	@ViewById
	TextView tv;
	//AfterViews注释定义的方法会在OnCreate方法的setContentView后执行
	@AfterViews
	void init()
	{
		tv.setText("asfsdf");
	}
}

源代码托管在GitHub,https://github.com/excilys/androidannotations/,怎么配置项目请参考Wiki. Continue reading ‘Android开发 使用AndroidAnnotations快速开发应用’ »

Android 开发 Activity加载完成事件

项目需要,在Activity加载时通过代码动态在屏幕上显示数量位置不等的按钮,因为按钮的位置都根据底下的一张图片来确定的(其实就是Google地图的大头针功能),如果在onCreate或onResume事件中计算按钮数量及位置,因为底部的图片没加载完,无法得到想要的结果,Activity在UI加载完成后,会获取到焦点,调用onWindowFocusChanged事件,因些,只需重写这个事件,在这里计算即可。

Android 开发 计算文本占用的宽度

有个项目需要动态确定TextView的位置,需要把TextView的中心点放在指定的坐标,但发现,构建了TextView后,无法用getHeight和getWidth方法取到高宽度,返回都是0.
用下面的方法可以取到所占的宽度:


    	Paint paint=new Paint();
    	paint.setTextSize(21.6f);//设置字符大小
    	int textWidth=(int)paint.measureText(text, 0, text.length());

Android 开发 对话框Dialog dismiss和hide方法的区别

dismiss和hide方法都可以隐藏对话框,在需要的时候也可以用show方法调用显示。但是,这两者是有区别的。
dismiss方法会释放对话框所占的资源,而hide方法不会。activity退出前必须调用dismiss方法关闭对话框。
如果对话框上有progressbar,你会发现,调用dismiss方法后,再调用show方法,出来的对话框,上面的progressbar不再会转动,而调用hide方法的则没有问题。
所以,最正确的调用方法是,在activity的onDestory方法里调用dismiss方法,其他地方都用hide方法隐藏对话框。

Android开发 rotate动画 匀速旋转的实现

匀速旋转,就是能过设置加速器android:interpolator,但是在xml中设置:


android:interpolator="@android:anim/linear_interpolator"

发现没有任何效果,还是加速的。
在代码中设置,解决:


		LinearInterpolator lir = new LinearInterpolator();
		rotate.setInterpolator(lir);