-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
1,Activity:一切可视化的操作
2,数据存储:通讯录
3content provider
4,服务和广播
5,网络:天气预报,rss阅读器
6多媒体:音乐播放器。
7位置服务和百度地图:
8,桌面常驻小控件
9,比较复杂组件
四大组件:Activity ,Service, BroadCast, Content Provider
第一章:Actiity
1,布局管理器
1) 线性布局,
a) Layout_weight:fill_parent
b) 比重是相反的
Margin:外边距
Pedding:内边距
Gravity=”right/bottom”____center
2) 表格布局
tablelayout
3) 相对布局
下边是相对布局属性的说明:RelativeLayout
android:layout_above 将该控件的底部至于给定ID控件之上
android:layout_below 将该控件的顶部至于给定ID的控件之下
android:layout_toLeftOf 将该控件的右边缘和给定ID的控件左边缘对齐
android:layout_toRightOf 将该控件的左边缘和给定ID的控件的右边缘对齐
android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐
android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘对齐
android:layout_alignLeft 将该控件的左边缘与给定ID控件的左边缘对齐
android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐
android:layout_alignTop 将该控件的顶部边缘与给定ID控件的顶部对齐
android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐
android:layout_alignParentLeft 如果该值为true,则将该控件左边与父控件的左边对齐
android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐
android:layout_alignParentTop 如果该值为true,则将该控件的顶部与父控件的顶部对齐
android:layout_centerHorizontal 如果为真,该控件将被至于水平方向的中央
android:layout_centerInParent 如果为真, 该控件将被至于父控件水平方向和垂直方向的中央
android:layout_centerVertical 如果为真,该控件将被至于垂直方向的中央
android:layout_marginLeft此属性用来设置控件之间的间隙(控件和控件之间和内边距不同)
android:padding="3dip"说明了四边的内边距是3dip
4)
5) 帧布局
一个组件放在另一个组件上,
6) 绝对布局
2,控件
a) 简单组button ,edittext,textview,imageview,radiobutton,radiogroup,checkbox,imagebutton
//Analogclock,digitalclock,datepicker,timepicker,progressbar进度条,seekbar拖拽条,ratingbar。
b) 复杂组件:加适配器。
ArrayAdapter,字符串的形式
SimpleAdapter,数据源必须是list<map<>>
BaseAdapter:数据源既可以是list<map<>>,list<student>,数组。
需要取到每个项目中的组件
listview,
spinner,下拉列表:结合ArrayAdapter。
gridview,
gallery,
expandedable
listview
4月16日
ListView
ArrayAdapter,SimpleAdapter,BaseAdapter。
MVC模式
Model,view,control,
Utils,globe。
1,BaseAdapter
1),首先自己写一个类,让它继承BaseAdapter这个类。
2)重写其中的一些方法。在listview里主要是重写两个
a) 返回值表示listview要显示的选项的数目
public int getCount() {
return list.size();
}
b) //返回值表示当前正在加载选项的视图
//positon 是一个索引。
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater l=LayoutInflater.from(MainActivity.this);
View view=l.inflate(R.layout.item, null);
TextView tv_name= (TextView) view.findViewById(R.id.tv_name);
TextView tv_phone= (TextView) view.findViewById(R.id.tv_phone);
tv_name.setText(list.get(position).getName());
tv_phone.setText(list.get(position).getPhone());
CheckBox checkbox= (CheckBox) view.findViewById(R.id.checkbox);
checkbox.setFocusable(false);
return view;
}
3)注意事项:如果点击事件更新了数据,那么需要重新加载一下listview。
那么就需要调用一下adapter.notifyDataSetChanged()方法,以更新数据。
4)如果listview中添加了复选按钮,注意,两个点击事件都要写,做到同步。
5)Button会在页面加载时,为listiew设置item中含有Button类控件时,item失去焦点,不响应onclick事件, item中有button类控件时,item失去焦点,因此可以通过两种方法解决
1.item中的button控件 android:focusable="false",即button类控件主动失去焦点,
2. Listview属性加入android:descendantFocusability="blocksDescendants" ,即阻止子控件获得焦点。
2项目,全选按钮à逻辑分析
主动设置全部:
a) 选中复选框,那么全部选择。
b) 不选中复选框,那么全部取消。
被动设置:
a) 如果改动到了所有的listview中的按钮都未选中的话,那么也把复选框变成未选中状态。
b) 如果改动到了所有listview的按钮都选中个的状态,那么复选框也变成选中的状态。
1, 首先,要写一个方法。这个方法的功能是返回一个boolean类型的值,以判断是不是全部被选中的状态,如果是,那么为true,如果不是,那么为false。
2, 通过这个方法,就可以设置复选按钮的状态,这时候遇到一个问题。那就是,如果复选框变成了未选中状态,就会继续执行监听事件中的代码,改动一个,全部都取消了,这不是我们要达到的目的。
3, 为了解决上述问题,我们需要设置一个属性flag。
如果flag=true,那么说明是主动触发了复选框。
如果flag=false,那么说明是被动的触发了复选框,此时不执行监听事件。
4, 这时又遇到了一个问题,那就是,如果我们在被动触发事件中把flag变成了false,那么在这个方法结束时。要把它的属性改回来,不然主动触发也会失效。
关键代码如下:
//判断选中状态的方法,全选则返回true,没有全选则返回false。
public boolean getState(){
for(int i=0;i<list.size();i++){
if(list.get(i).isFlag()==false){
return false;
}
}
return true;
//复选按钮的点击事件
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(flag){//这句话的意思是,只有主动点击,才会执行以下代码。
if(isChecked){
for(int i=0;i<list.size();i++){
list.get(i).setFlag(true);
}
}else{
for(int i=0;i<list.size();i++){
list.get(i).setFlag(false);
}
}
adapter.notifyDataSetChanged();//更新。
}
}
//listview中的复选按钮的点击事件。
checkbox.setFocusable(false);//这句话是不让checkbox主动获取焦点。
if(list.get(position).isFlag()==true){
checkbox.setChecked(true);//如果状态是选中,那么复选按钮变为选中
}else{
checkbox.setChecked(false);//如果未选中,那么复选按钮变为未选中。
}
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//在状态是true的情况下,会把复选框的属性设为false,但是这是一个被动事件,因此,需要将flag(也就是判断主动被动的标记)设置为false,这样,随着控制全局的复选按钮状态的变化,不会执行监听事件中的代码。
if(list.get(position).isFlag()==true){
list.get(position).setFlag(false);
flag=false;
checkbox1.setChecked(false);
}else{
//如果把一个复选框的状态变成了选中,那么此时就要判断一下是不是都选中了,
如果都选中了,那么就让控制全局的复选按钮也变为选中状态
list.get(position).setFlag(true);
if(getState()){
checkbox1.setChecked(true);
}
}
//通知适配器重新加载数据
flag=true;
//注意:执行完这个事件之后应该把flag还原为true,否则,主动的事件也不会被执行。
}
});
return view;
4月17日
1, gridview (网格视图)。BaseAdapter。
android:numColumns="3"//该属性的意思是每行加载几个条目。
ImageSwichter:
a) imageswitcher.setAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.fade_in));
b) imageswitcher.setAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.fade_in));//这句话的意思是,设置动画效果。
c) imageswitcher.setFactory(new ViewFactory() {
//返回值是一个视图。
public View makeView() {
ImageView imageview=new ImageView(MainActivity.this);
//在imageswitcher里面新建一个imageview。
imageview.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
//设置新建的imageview的宽和高。分别都是充满父控件。
return imageview;
}
});
d) imageswitcher.setBackgroundResource(images[arg2]);//设置imageswitcher的背景资源。
2,gallery:画廊。Spinner有相同的父类。expandeableListview
1)android:spacing="0dp"//设置的是图片之间的间距
android:unselectedAlpha="0.5" //设置的是未选中图片的透明度。
2) 为了是图片能够连续滑动,需要修改一些值
a) public int getCount() {
// TODO Auto-generated method stub
return Integer.MAX_VALUE;
//此时让它返回integer中的最大值。
}
c) imageview.setBackgroundResource(images[position%(images.length)]);//设置时循环设置。
d) gallery.setSelection(Integer.MAX_VALUE/2);
//显示中间的那个position
3)//因为gallery和spinner有相同的父类,因此监听事件都是
gallery.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
imageswitcher.setBackgroundResource(images[arg2%(images.length)]);
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
3对话框
a) AlertDialog:弹出式对话框。
1) 简单对话框
Builder builder=new Builder(MainActivity.this);
//注意如果这么写要导包。。。Aandroid.app.AlertDialog.Builder;
builder.setIcon(R.drawable.icon);
//设置图标
builder.setTitle("这是一个对话框");//设置标题
builder.setMessage("请注意!!");
//设置提示信息。
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "用户点了确定", Toast.LENGTH_LONG).show();
}
});//(显示的文本内容,监听事件执行的代码)。
builder.setNegativeButton("取消",null);
builder.create().show();
//让建立的对象显示出来
2) 自定义对话框
Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.icon);
builder.setTitle("请输入登录信息");
View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null);
final EditText ed_name=(EditText) view.findViewById(R.id.ed_name);
final EditText ed_pass=(EditText) view.findViewById(R.id.ed_pass);
builder.setPositiveButton("登录",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String cc="用户名:"+ed_name.getText().toString()+"\n密码:"+ed_pass.getText().toString();
tv_show = (TextView) findViewById(R.id.tv_show);
tv_show.setText(cc);
}
});
builder.setNegativeButton("取消", null);
builder.setView(view);//在弹出窗口设置一个视图。
builder.create().show();
3) 单选对话框
4) 多选对话框
b) DataPickerDialog:日期选择对话框
c) TimePickerDialog:时间选择对话框
DatePickerDialog dateDialog=new DatePickerDialog(MainActivity.this, new OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
System.out.println(year+monthOfYear+dayOfMonth);
}
}, year, month, day);
dateDialog.show();
//建立这个类的对象需要五个参数。。(context,set按钮的事件,年,月,日)
时间相关的类
Date:new Date();
Calendar:get set
SimpleDateFormat:new Date(),用一些方法把时间转化成想要的形式。
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
tv_show.setText(sdf.format(new Date()));
//规范日期的格式
d) ProgressDialog:进度条对话框。
4月18日
1, Menu
(1) 菜单项。MenuItem
a)一些方法
当第一次点击menu时创建菜单,初始化,用这个方法
public boolean onCreateOptionsMenu(Menu menu)
每次点击menu件都调用,这个方法。
public boolean onPrepareOptionsMenu(Menu menu)
自学,长按
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
c) 添加菜单项的若干方法
MenuItem menu1=menu.add("添加联系人");
MenuItem menu2=menu.add(0,1,0,"WallPaper");
2)含有子菜单的菜单项。SubMenu
添加子菜单项的方法。
SubMenu menu1=menu.addSubMenu(0, 0, 0, "Add");
MenuItem item0=menu1.add(1,0,0,"shorcuts");
定义菜单的方式
(1) 代码中定义
a) 直接添加菜单的事件响应。onMenuItemClickListener
例如:menu1.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "点击menu1", Toast.LENGTH_LONG).show();
return false;
}
});
b) 统一的回调方法。
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){//获取id。
case 0:Toast.makeText(MainActivity.this, "添加联系人", Toast.LENGTH_LONG).show();break;
case 1:Toast.makeText(MainActivity.this, "删除联系人", Toast.LENGTH_LONG).show();break;
case 2:Toast.makeText(MainActivity.this, "查看联系人", Toast.LENGTH_LONG).show();break;
case 3:Toast.makeText(MainActivity.this, "修改联系人", Toast.LENGTH_LONG).show();break;
}
return super.onOptionsItemSelected(item);
}
(2)xml文件中配置。
2,关于可见性
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 按下某个按键发生的事件
if(keyCode==KeyEvent.KEYCODE_MENU){//如果按下的是菜单键
if(gridview.getVisibility()==View.INVISIBLE){
gridview.setVisibility(View.VISIBLE);}
else{
gridview.setVisibility(View.INVISIBLE);
gridview.setVisibility(View.GONE);
、、//visible和,gone的区别在于gone不占地方。
}
}
return super.onKeyDown(keyCode, event);
}
4月19日
Activity的生命周期
1,Oncreate:创建
OnStart:不可见变为可见的时候。
onResume:不可编辑到可编辑状况。
onRestart:重新启动的时候
onpause:由可编辑变为不可编辑
onstop:由可见变为不可见。
OnDestory:销毁。
MainActivity.this.startActivityForResult(intent, requestCode);
Intent intent=getIntent();
intent.putExtra("picture", x);
setResult(resultCode, data)
finish();
protected void onActivityResult(int requestCode, int resultCode, Intent data) {//T统一的回调方法 请求码 结果
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0&&resultCode==0){
String city=data.getStringExtra("city");
tv_city.setText("您所在的城市是:"+city);
}else if(requestCode==1&&resultCode==1){
int picture=data.getIntExtra("picture", R.drawable.kitty1);
imagebutton.setImageResource(picture);
}
}