一、Android布局:
布局的概念是针对Activity的。 在一个应用程序中通常由多个Activity构成,每个需要显示的Activity都需要在AndroidManifest.xml文件之中声明;
创建UI组件:通过xml方法配置; 当需要动态生成时,使用Java代码;
Android应用的绝大部分UI组件都放在android.widget包及其子包、android.view及其子包中。Android应用的所有UI组件都继承了View类。GroupView类是View类的子类,是所有布局管理器的父类。
结构:
| ||
android.view.ViewGroup
|
直接子类: AbsoluteLayout , AdapterView <T extends Adapter >, DrawerLayout , FragmentBreadCrumbs , FrameLayout ,GridLayout , LinearLayout , PagerTitleStrip , RelativeLayout , SlidingDrawer , SlidingPaneLayout , ViewPager
间接子类:
ViewGroup容器控制其子组件的分布依赖于ViewGroup.LayoutParams、ViewGroup.MarginLayoutParams两个内部类。
ViewGroup.LayoutParams提供两个XML属性设定组件的大小:
- android:layout_height:指定该子组件的基本高度;
- android:layout_width:指定该子组件的基本宽度。
这两个属性有三个特定的值:
- fill_parent:指定组件的高度、宽度与父容器组件的一样。
- match_parent:与fill_parent一样,Android2.2开始推荐使用。
- warp_content:内容包裹。
ViewGroup.MarginLayoutParams用于控制子组件周围的页边距:
- android:layout_marginBottom(下边距);
- android:layout_marginLeft(左边距);
- android:layout_marginRight(右边距):
- android:layout_marginTop(上边距)
对于View的尺寸,android提供了三种单位供选择使用:
- px:像素。
- dp:dpi,表示屏幕实际的像素。
- sp:会根据系统设定的字体大小进行缩放,与dp类似,通常用于设置字体。
二、Android控件:
- Button:
- 监听器:onClickListener;
- 需要实现的方法:public void onClick(View v),v表示触发的控件,比如按钮;
- ImageButton:
- 可以自定义图片的Button;
- ImageView的子类;
- TextView:
- 文本显示控件。预定义了一些类似于HTML的标签。多种配置属性。TextView无法输入;
- 结构:
- java.lang.Object
android.view.View
android.widget.TextView
- java.lang.Object
- 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText
- 间接子类: AutoCompleteTextView, CheckBox, CompoundButton, ExtractEditText,MultiAutoCompleteTextView, RadioButton, ToggleButton
- EditText:
- TextView的子类,文本控件,提供文本输入的功能。可以理解为可以输入的TextView。(如添加表情图片,输入内容验证,错误提示消息等)
- CheckBox:
- 多选框;
- 监听器: onCheckedChangeListener;
- 需要实现的方法: public void onCheckedChanged(CompundButton buttonView,boolean isChecked);
- RadioButton:
- 单选框;
- 监听器: OnCheckedChangeListener;与CheckBox的监听器名字相同,但不在同一个包;
- 多个单选框放在RadioGroup中;
- Toggle Buttons \ Switches:
- 在属性中加入 android:onClick,实现方法
public void onToggleClicked(View view) {
// Is the toggle on?
boolean on = ((ToggleButton) view).isChecked();
if (on) {
// Enable vibrate
} else {
// Disable vibrate
}}
- Spinners:
- 从集合中选择一个值
- spinner中供选择的项可以来自任何源,但必须通过一个SpinnerAdapter。如:源是一个数组,使用ArrayAdapter,源来自数据库查询,使用CursorAdapter。如果提供的选择是事先定义好的,使用一个string resource file:
- <?xml version="1.0" encoding="utf-8"?><resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array></resources>
- <?xml version="1.0" encoding="utf-8"?><resources>
- 监听器: OnItemSelectedListener
- 实现的方法:
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
// An item was selected. You can retrieve the selected item using
// parent.getItemAtPosition(pos)
}
public void onNothingSelected(AdapterView<?> parent) {
// Another interface callback
}
- Pickers:
- ImageView:
- 显示任意图像,例如图标。ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,比便它可以在其他布局中使用,并提供例如缩放和着色(渲染)各种显示选项;
- 结构:
java.lang.Object
android.view.View
android.widget.ImageView - 直接子类: ImageButton, QuickContactBadge
- 间接子类: ZoomButton
- ProgressBar:
- 进度条;
- Dialog:
- 提示框;
- 不在xml中定义,直接在Activity中创建;
- TabHost:
- 不在xml中定义,直接在TabActivity中创建(Activity需要继承TabActivity);
- TabSpec为引用布局文件的ID;
- 监听器: OnTabChangedListener;
- 需要实现的方法: public void onTagChanged(String tabId);
- SeekBar:
- 拖动条;
- 监听器: OnSeekBarChangeListener;
- 实现方法:
- public void onStartTrackingTouch(SeekBar seekBar); //开始移动时调用
- public void onStopTrackingTouch(SeekBar seekbar); //结束移动时调用
- public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser); //改变时调用,progress为当前值
一般说来,声明UI元素所用到的XML词汇(vocabulary)跟类和方法的命名以及结构对应得很紧密,体现在元素的名字对应于类名而属性名对应于方法名。
三、事件监听器
事件监听器是View类中只包含一个回调方法的接口。当一个控件注册了事件监听器并且发生了相应的UI事件,这个方法就会被Android系统调用。
监听器中包含的回调方法:
onClick():
From
View.OnClickListener
. 这个方法在触摸模式下,触碰到就会被触发;使用导航键或者轨迹球是这个 View 获取焦点,然后点击"Enter"或者按下轨迹球,这个方法也会被触发。
onLongClick():
From
View.OnLongClickListener
. 在触摸模式下,用户长按着这个控件,将会调用这个方法;通过导航键或者轨迹球定位到这个控件,然后长按“Enter”键或者按住轨迹球(一秒中),这个方法将会被调用。
onFocusChange():
From
View.OnFocusChangeListener
. 当用户使用导航键或者轨迹球,将焦点由这个控件移向其他控件时,这个方法会被调用。
onKey():
From
View.OnKeyListener
. 当这个控件获得焦点时,用户按下或者松开设备的物理按键,这个方法就会被调用。
onTouch():
From
View.OnTouchListener
. 发生在这个控件上(在控件的边界之内)的移动、按下、松开等操作都会调用这个方法。
onCreateContextMenu():
From
View.OnCreateContextMenuListener
. 当 Context Menu 被创建时调用(比如我们在长按某个控件时,会弹出菜单来让用户做一些选择)。这一点将会在
Menus 文章中详细介绍。
事件处理器:
- 新的按键事件发生时调用.onKeyDown(int, KeyEvent)
- 按键抬起事件发生时调用.onKeyUp(int, KeyEvent)
- 轨迹球移动时调用.onTrackballEvent(MotionEvent)
- 触摸屏幕时调用.onTouchEvent(MotionEvent)
- 当一个控件得到焦点或失去焦点时调用.onFocusChanged(boolean, int, Rect)