分类: 嵌入式
2012-03-03 07:52:41
屏幕是简化的窗口,在Android中,常常使用的就是这种简单的“窗口”。屏幕和屏幕中的内容是Android中UI构建的主要内容。这两个方面包括:
Android中屏幕及其中内容的程序结构如图2-1所示。
图2-1 Android中屏幕及其中内容的程序结构
如图2-1所示,android.app包中的Activity和android.view包中的View分别用于表示一个屏幕和一个视图的基类。
Android用户界面的基本构建方法分成以下几个步骤:
è 2.1.1 屏幕(活动Activity)android.app.Activity类是Android中的活动,是Android四种组件中用来表示UI方面的组件。一个Activity中最主要的内容就是一个视图(View),此外,这个类还包含了标题栏、菜单、对话框附属功能。
活动的生命周期如图2-2所示。
图2-2 活动的生命周期
在应用程序中实现自己的活动的时候,通常需要继承一个Activity类,并主要实现Activity中的以下几个protected的方法:
protected void onCreate (Bundle savedInstanceState) // 创建时调用
protected void onStart () // 开始时调用
protected void onResume () // 恢复时调用
protected void onPause () // 停止时调用
protected void onStop () // 完全停止时调用
protected void onRestart () // 重新开始时调用
protected void onDestroy () // 销毁时调用
这些以on为开头的方法用于指定一个活动的状态机转换时刻的行为,将在一个活动生命周期中运行的不同阶段被调用。
在一个Activity中,提供了以下一些接口来设置其中的内容:
public void setContentView(int layoutResID) // 以布局文件的方式来设置
public void setContentView(View view) // 以视图类的方式来设置
public void setContentView(View view, ViewGroup.LayoutParams params)
setContentView()用于将一个视图(View)设置到活动中,通常在所实现Activity的onCreate()阶段被调用。
è 2.1.2 屏幕中的内容(视图View)android.view.View表示可见的视图内容,它表现为界面上的可视内容,也可以接收事件。在程序中具体使用的类一般是View的继承者。各种View的继承者可以在布局文件中被描述。
View的主要标识是它的id,查找子View的方法。
public final View findViewById(int id)
View的事件主要由其中的监听者(Listener)来获得,在View类中具有setOn{XXX}Listener()系列方法,内容如下所示:
public void setOnClickListener(View.OnClickListener l);
public void setOnLongClickListener(View.OnLongClickListener l);
public void setOnFocusChangeListener(View.OnFocusChangeListener l);
public void setOnKeyListener(View.OnKeyListener l);
public void setOnTouchListener(View.OnTouchListener l);
public void setOnCreateContextMenuListener(View.OnCreateContextMenuListener l)
这些方法的参数分别为android.view包中的几个接口,如表2-1所示。
表2-1 事件处理接口
监听者功能
监 听 类
接口中的方法
单击
OnClickListener
void onClick(View v)
长按
OnLongClickListener
boolean onLongClick(View v)
焦点变化
OnFocusChangeListener
void onFocusChange(View v, boolean hasFocus)
按键
OnKeyListener
boolean onKey(View v, int keyCode, KeyEvent event)
触摸
OnTouchListener
boolean onTouch(View v, MotionEvent event)
上下文菜单
OnCreateContextMenuListener
void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo)
这些接口通常需要被用户程序实现。需要实现的方法中,均以View为第一个参数,当这些方法被调用的时候,传入的第一个参数通常就是发生事件的View。
è 2.1.3 二者的结合View及其继承者通常可以设置到Activity中,作为其中的内容来使用。设置的方法通常是使用Activity的setContentView()方法。
例如使用如下的方法将一个布局文件设置到活动当中。
setContentView(R.layout.mylayout);
布局文件可以转化成View类。这是需要使用的是android.view包中的LayoutInflater类。此时主要使用类中的以下几个方法:
public View inflate (int resource, ViewGroup root)
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
public View inflate (XmlPullParser parser, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)
LayoutInflater功能就是根据布局文件的id或者XML文件,将其转化为一个View类型的内容。
在一个活动中进行如下的调用,将布局文件设置到其中:
LayoutInflater factory = LayoutInflater.from(this);
final View mylayout = (View )factory.inflate(R.layout.mylayout, null);
setContentView(mylayout);
这种实现方式等价于上述直接将布局文件设置到Activity中的方式,但是两个setContentView()的参数不同,前者使用的是整数参数,表示布局文件的id,后者使用的是一个View类型。所谓XML格式的布局文件,经过解析之后的结果实际上是一个对多层次组成的View。
提示:Activity中的setContentView()一般设置布局文件即可,没有必要拆成解析和设置两个步骤。在需要View类型的参数时,LayoutInflater可完成布局文件到View的转换。