黑马程序员-----------android自学第一天总结

-----------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

416

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中添加了复选按钮,注意,两个点击事件都要写,做到同步。

5Button会在页面加载时,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;

 

417

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

1android: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//因为galleryspinner有相同的父类,因此监听事件都是

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();

 

//建立这个类的对象需要五个参数。。(contextset按钮的事件,年,月,日)

时间相关的类

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:进度条对话框。

 

418

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);

    }

2xml文件中配置。

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);

}

419

Activity的生命周期

1Oncreate:创建

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);

     }

    

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值