安卓应用中的所有组件都继承了View类,View组件很像Swing中的JPanel,一个空白的矩形区域。
ViewGroup容器控制其子组件的分布依赖于ViewGroup.LayoutParams、ViewGroup.MarginLayoutParams两个内部类,对应的XML属性:
android:layout_height、android:layout_width、android:layout_marginBottom、android:layout_marginLeft、android:layout_marginRight、android:layout_marginTop
用Java代码开发UI示例:
public class A extends Activity{
//当第一次创建该Activity时回调该方法
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//创建一个线性布局管理器
LinearLayout layout=new LinearLayout(this);
//设置该Activity显示layout
super.setContentView(layout);
//创建一个Button
Button bn=new Button(this);
bn.setText(R.string.ok);
bn.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));
//向Layout容器中添加Button
layout.addView(bn);
//为Button绑定一个事件监听器
bn.setOnClickListener(new OnClickListener(){
public void onClick(View v){
//事件动作
}
});
}
}
上例中,无论哪种组件,都传入了一个this参数,本质上是Context参数(Activity和Service都继承了Context),代表访问安卓应用环境的全局信息的API,这样可以让这些UI组件通过该Context组件获取安卓应用环境的全局信息。
开发自定义View(在配置文件中使用自定义View时要使用类的全限定名)
定义一个继承View的基类的子类,然后重写View类的一个或者多个方法,通常可以被用户重写的方法如下:
构造器:重写构造器是定制View的最基本方式,当Java代码创建一个View实例,或根据XML布局文件加载并构建界面时将需要调用该构造器。
onFinishInflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被回调。
onDraw(Canvas):当该组件将要绘制它的内容时回调该方法进行绘制。
onKeyDown(int,KeyEvent):当某个键被按下时触发该方法。
onTouchEvent(MotionEvent):当发生触摸屏事件时触发该方法。