1、View视图组件:所有的高级UI组件都是继承View类而实现的。一个view在屏幕上占据一块矩形区域,负责渲染这块矩形局域,也可以处理这块矩形区域是上的事件。
Viewgroup视图容器组件:就是View的容器,负责对添加进Viewgroup的这些View进行布局。容器也可以嵌套。
Layout布局组件:实现组件在页面上的展示布局
LayoutParams布局参数:
2、android:layout_width — 一般的值为“fill_parent”、“wrap_content”、“match_parent”。(带有layout的属性是指整个控件而言的,是与父控件之间的关系;而不带layout的属性是对控件中文本的格式)
android:layout_alignParentRight — 使当前空间的右端和父控件的右端对齐。属性值只能为true或false。
android:completionThreshold — 属性设置了一个阀值,规定用户打了多少字符之后才出现自动提示,默认值是2,我们在这里改成了1。
android:dropDownHorizontalOffset — 设置下拉菜单与文本框之间的水平偏移
android:completionHint — 设置出现在下拉菜单中的提示标题
设置单元格内的控件的形状(可压缩,可伸长,可隐藏等)
android:shrinkColumns设置该列的所有单元格的宽度可以被收缩,以保证该表格能够适应父容器宽度
android:stretchColumns 设置该列的所有单元格的宽度可以被拉伸,以保证组件能完全填满表格空余空间
android:collapseColumns设置该列的所有单元格会被隐藏
3、布局:
1)FrameLayout:整个界面被当成一块空白备用区域,所有的子元素都不能被指定放置的位置,它们统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分或全部遮挡。
2)LinearLayout:按照垂直或水平的顺序依次排列子元素,每一个子元素都位于前一个元素之后。如果是垂直排列,将是一个N行单列的结构;如果是水平排列,将是一个单列N行的结构。LinearLayout中的子元素属性android:layout_weight生效,它用于描述该子元素在剩余空间中占有的大小比例。android:layout_weight遵循数值越小,重要度越高的原则。如:一行中有两个不等长的文本框,那么他们的android:layout_weight值分别为1和2,那么第一个文本框将占据剩余空间的三分之二,第二个文本框将占据剩余空间中的三分之一。
3)RelativeLayout:按照各子元素之间的位置关系完成布局。在此布局中的子元素里与位置相关的属性都将生效。子元素就是通过这些位置属性和各自的ID配合指定位置关系的。需要注意的是:引用的ID必须在引用之前,先被定义,否则将异常。
常用位置属性:
android:layout_toLeftOf —— 该组件位于所引用组件的左方
android:layout_toRightOf —— 该组件位于所引用组件的右方
android:layout_above —— 该组件位于所引用组件的上方
android:layout_below —— 该组件位于所引用组件的下方
android:layout_alignParentLeft —— 该组件是否对齐父组件的左端(只有true或false)
android:layout_alignParentRight —— 该组件是否齐其父组件的右端
android:layout_alignParentTop —— 该组件是否对齐父组件的顶部
android:layout_alignParentBottom —— 该组件是否对齐父组件的底部
android:layout_centerInParent —— 该组件是否相对于父组件居中
android:layout_centerHorizontal —— 该组件是否横向居中
android:layout_centerVertical —— 该组件是否垂直居中
4)TableLayout:表格布局,使用于N行N列的布局格式。一个TableLayout是由许多的TableRow组成的,一个TableRow就代表一个TableLayout中的一行。TableRow是LinearLayout的子类,它的android:orientation属性值恒为horizontal,并且它的android:layout_width和android:layout_height属性值恒为MATCH_PARENT和WRAP_CONTENT。所以它的子元素都是横向排列,并且宽高一致的。这样的设计使得每个TableRow里的子元素都相当于表格中的单元格一样。在TableRow中,单元格可以为空,但是不能跨列。
5)AbsoluteLayout:绝对位置布局,在此布局中的子元素的android:layout_x和android:layout_y属性将生效,用于描述子元素的坐标位置。屏幕左上角为坐标原点(0,0),向右下方向是逐渐增大的过程。在实际的开发中,通常不采用此布局格式,因为代码过于刚性,不能呢个适合所有的终端。
4、android里的字体大小单位
1)px:象素,屏幕实际的象素。
2)in:英寸,屏幕的物理尺寸
3)mm:毫米,屏幕的物理尺寸
4)pt:点,屏幕的物理尺寸。1/72英寸
5)dp/dip:与密度无关的象素,一种基于屏幕密度的抽象单位。
6)sp:与刻度无关的象素,主要用于字体显示,作为和文字相关大小单位。
5、android实现事件功能的方法
1)匿名内部类作为事件监听器类:
Button button = (Button) findViewById(R.id.cbutton);
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
setTitle("button is clicked!");
}
});
这种方法是推荐使用的因为事件处理器没有什么共享的价值,大部分事件监听器都是使用一次。
2)内部类作为监听器
class MyButton implements OnClickListener{
@Override
public void onClick(View v) {
setTitle("button is clicked!");
}
}
使用内部类的好处是,可以再当前类中复用监听器类。
3)Activity本身作为事件监听器,即activity继承监听器类
public class MainActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.cbutton);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
setTitle("button is clicked!!!");
}
}
这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。Activity的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。
4)外部类作为监听器:就是把监听器类写在Activity类的外部,调用方式和内部类一样。
6、常用widget组件:Button、TextView(文本框)、EditView(编辑框)、
CheckBox(多向选择框):触发OnCheckedChange事件,可以对应的使用OnCheckedChangeListener监听器来监听这个事件。两种不同写法的事件响应:第一种是内联函数的方式;第二种是整个Activity本身作为事件监听器。
beijing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
editText1.setText(buttonView.getText()+"选中");
}else{
editText1.setText(buttonView.getText()+"取消选中");
}
}
});
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
r += (String) buttonView.getText();
} else {
String s = (String) buttonView.getText();
if(null != s){
r = r.replace(s, "");
}
}
setTitle("get by selected: " + r);
}
RadioGroup mygroup = (RadioGroup) findViewById(R.id.radio_group);
final RadioButton one = (RadioButton) findViewById(R.id.radio0);
final TextView txt = (TextView) findViewById(R.id.textView1);
mygroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(checkedId == one.getId()){
txt.setText(one.getText());
}
}
});
Spinner(下拉列表):详见Spinner下拉列表装填数据的方法 和Android的Adapter的用法
AutoCompleteTextView(自动完成文本):
public class AutoCompleteActivity extends Activity {
String[] books = new String[] { "rollen", "rollenholt", "rollenren", "roll" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.autocomplete);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.myautocomplete);
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, books);
textView.setAdapter(adapter);
}
}
----------------------
DatePicker(日期选择器):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.datepicker);
DatePicker dp = (DatePicker) this.findViewById(R.id.datepicker);
final TextView dateEt=(TextView)findViewById(R.id.datetext);
TimePicker tp = (TimePicker) this.findViewById(R.id.timepicker);
final TextView timeEt=(TextView)findViewById(R.id.timetext);
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
dp.init(year, month, day, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
dateEt.setText("您选择的日期是:"+year+"年"+(monthOfYear+1)+"月"+dayOfMonth+"日。");
}
});
tp.setCurrentHour(calendar.get(Calendar.HOUR));
tp.setCurrentMinute(calendar.get(Calendar.MINUTE)); // 根据需要设置时间
tp.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
timeEt.setText("您选择的时间是:"+hourOfDay+"时"+minute+"分。");
}
});
ScrollView(滚动试图):
ScrollView的主要功能是将一个屏幕显示不了的内容,通过滚动显示出来,使用这个组件也比较直观,直接在XXLayout外面加上ScrollView组件申明即可,java代码不用动。
.... ....
ProgressBar(进度条):
重要的方法:
getMax():返回这个进度条的范围的上限
getProgress():返回进度
getSecondaryProgress():返回次要进度
incrementProgressBy(int diff):指定增加的进度
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
重要事件:
onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件
7、Dialog对话框
dialog直接由Object构造出来,由activity来维护其生命周期,负责生成、保存、回复它。
showDialog(int id):负责显示标识为id的dialog。
dimissDialog(int id):根据id小时米格dialog
Dialog有两个比较常见的回调函数,onCreateDialog(int id)和onPrepareDialog(int id, Dialog dialog)。
当activity调用来了showDialog后,如果Dialog是第一次生成,系统将反向调用Dialog的回调函数onCreateDialog,然后再调用onPrepareDialog;吐过这个Dialog已经生成,只不过还没有显示出来,将直接调用onPrepareDialog方法。
--------
AlertDialog是Dialog的一个直接子类,一个AlertDialog可以有两个或三个Button,可以对一个AlertDialog设置title和message。不能直接通过AlertDialog的构造函数来生成一个AlertDialog,一般是通过它的一个内部静态类AlertDailog.Builder来构造。
1)确认对话框:就是确定或取消
private void comfirmDialog(){
AlertDialog.Builder builder = new Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setMessage("Are you confirm to exit?");
builder.setTitle("notice");
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
setTitle("you click the confirm button.");
}
});
builder.create().show(); //生成配置好的Dialog,并显示出来
}
2)信息内容显示的是View类型的,自定义类型
builder.setView(View),通过这种方法将实现好的个性化View放置到Dialog里去。
LayoutInflater inflater = LayoutInflater.from(this);
final View view = inflater.inflate(R.layout.inflate, null);
builder.setView(view);
// 如何取动态页面控件的值
EditText username = (EditText) view.findViewById(R.id.username);
LayoutInflater:对于没有被载入或者动态载入的界面,可以用它。它是用来找layout下xml布局文件,并实例化对象。
可以通过getSystemService(Context.LAYOUT_INFLATER_SERVICE)或LayoutInflater inflater = getLayoutInflater()或者LayoutInflater.from(this)d来获得LayoutInflate实例对象,在通过inflate方法载入layout的xml文件。
getSystemService里的activity中的方法,根据传入的name来取得对应的服务对象,这些服务名称参数都是Context类中的变量:
传入的Name 返回的对象 说明
WINDOW_SERVICE WindowManager 管理打开的窗口程序
LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml里定义的view
ACTIVITY_SERVICE ActivityManager 管理应用程序的系统状态
POWER_SERVICE PowerManger 电源的服务
ALARM_SERVICE AlarmManager 闹钟的服务
NOTIFICATION_SERVICE NotificationManager 状态栏的服务
KEYGUARD_SERVICE KeyguardManager 键盘锁的服务
LOCATION_SERVICE LocationManager 位置的服务,如GPS
SEARCH_SERVICE SearchManager 搜索的服务
VEBRATOR_SERVICE Vebrator 手机震动的服务
CONNECTIVITY_SERVICE Connectivity 网络连接的服务
WIFI_SERVICE WifiManager Wi-Fi服务
TELEPHONY_SERVICE TeleponyManager 电话服务
3)信息内容是一组单选框、多选框或简单列表项
单选框:setSingleChoiceItems()方法
多选框:setMultiChoiceItems()方法
列表项:setItems()方法
4)进度条dialog
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("downloading the songs");
dialog.setMessage("waiting...");
dialog.show();
8、Toast和Notification
pendingIntent:可以看成是对Intent的包装,当前app不能用它马上启动其所包含的Intent,而是在外部app执行这个pendingIntent时,间接地、实际地调用里面的Intent的。pendingIntent主要的信息时其所包转的intent和当前app的content。
主要用于处理即将发生的事情,比如Notification中用于页面的跳转,但不是马上跳转。(intent是及时启动,随所在的activity消失而消失)