一、如何导入jar文件:
(1)Build path添加,添加的是本地jar,如果项目拷走,在其它电脑中没有jar文件会报错。
(2)直接把jar文件copy到libs中,方便移植,工具会自动把libs中的jar文件添加到构建文件中。
二、Android开发中常用的常量:
(1)String类型:都要写入在res/values/string.xml
普通字符串:
(2)创建数组:
(3)Color颜色:要写在res/values/colors.xml
(4)Dimen尺寸:在res/values/dimens.xml
三、ListView:列表视图
它会随着内容的增加,高度和宽度会改变。如果内容超出了范围,会自动添加滚动条。ListView在显示时需要一个布局文件来呈现每一行中的内容。
要确定ListView中每一行显示数据的格式。
(1)添加"读入""写入"按钮,实现数据库的读取,在添加ListView按钮。ListView按钮用于显示从数据库读取的数据。
例:
(1)创建ListView中每一行数据的布局文件。
(2)创建向ListView中要显示的数据。
(3)数据的格式是List
(4)在显示的时候通过Map中Key与布局文件中控件的id进行绑定。
序列化:把java中的对象拆分到字符流中进行数据的传递。
为了减少用户的麻烦,在接口下创建了适配器Adapter。
一般一个类要继承接口必须要重写其中的方法。无论接口中有多少方法,继承接口的类都要予以实现。
但很多时候我们只想实现接口中的某一个方法,这时就需要适配器。它就可以实现接口的任意一个方法。
实例如下:
public interface UserDao()
{
public void save();
public void print();
}
public class UserDaoAdapter implements UserDao
{
public void save();
public void print();
}
public class UserInfoImpl extends UserDaoAdapter
{
public void save();
}
定义变量如下:
private Button btnRead;
private ListView listusers;
//使用HashMap的原因:HashMap可以通过intent进行数据的传递而Map不能用intent传递
private List> data;
//创建适配器,负责转换数据
private SimpleAdapter adapter;
private void findView()
{
this.btnRead=(Button) findViewById(R.id.button_read);
this.listusers=(ListView) findViewById(R.id.main_list_info);
}
private void initData()
{
data=new ArrayList>();
HashMapitem=null;
for(int i=0;i<10;i++)
{
//注意每循环一次都要重新创建该对象,保证数据不重复
item=new HashMap();
item.put("user_id", "101"+i);
item.put("user_name", "zhangsan"+i);
item.put("user_sex", i%2==0?"female":"male");
data.add(item);
}
//ListView本身不识别该格式的数据。此时需要一个转换器(适配器)把List数据转换为ListView可以识别的类型
/**
* context:上下文,表示该对象在那个页面中创建,属于哪一个项目
* data:是一个List
运行效果:
图 3.4
实际开发中通常是没有删除操作的,不执行delete语句。通过使用update语句去修改。改变数据状态,由1变为0。
基于数据库的listview操作:
(1)创建db.properties文件,用于创建数据库:
图3.5 db.properties
(2)创建UserInfoDao层:
public UserInfoDao(Context context)
{
super(context);
}
public void save(String name,String sex)
{
String sql="insert into user_info(user_name,user_sex)"
+ " values(?,?)";
super.executeUpdate(sql, name,sex);
}
public void delete(String id)
{
String sql="delete from user_info "
+ " where user_id=?";
super.executeUpdate(sql, id);
}
public List> findAll()
{
String sql="select user_id,user_name,user_sex "
+ " from user_info order by user_id desc";
return super.executeQuery(sql);
}
//模糊查询
public List> findByLike(String name)
{
String sql="select user_id,user_name,user_sex "
+ " from user_info "
//+ " where user_name like '%?%'"; ?表示标点符号
+ " where user_name like ?";
return super.executeQuery(sql, "%"+name+"%");
}
private UserInfoDao userInfoDao;
public UserInfoService(Context context)
{
this.userInfoDao=new UserInfoDao(context);
}
public boolean doReg(String name,String sex)
{
boolean flag=false;
try
{
this.userInfoDao.save(name, sex);
flag=true;
} catch (Exception e)
{
e.printStackTrace();
}
return flag;
}
public List> findAll()
{
List> data=null;
try
{
data=this.userInfoDao.findAll();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
public boolean doDelete(HashMap item)
{
boolean flag=false;
try
{
this.userInfoDao.delete(item.get("user_id"));
flag=true;
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
4.1、初始化:
private Button btnRead;
private Button btnWrite;
private UserInfoService userInfoService;
private ListView listUsers;
//使用HashMap的原因,HashMap可以通过Intent进行数据的传递
private List> data;
//创建适配器,负责转换数据
private SimpleAdapter adapter;
private void findView()
{
this.btnRead=(Button) findViewById(R.id.button2);
this.listUsers=(ListView) findViewById(R.id.main_list_users);
this.btnWrite=(Button) findViewById(R.id.button1);
}
private void initData()
{
this.userInfoService=new UserInfoService(this);
data=new ArrayList>();
// ListView 本身不识别 该格式的数据
// 此时此刻,需要一个转换器(适配器) 把List数据转换为ListView可以识别的格式
// context :上下文,表示该对象在哪个页面中创建,属于哪一个项目
// data :List
4.2、添加事件:
private void setListener()
{
this.btnWrite.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String name="zhangsan";
String sex="男";
boolean flag=userInfoService.doReg(name, sex);
if(flag)
{
System.out.println("=======ddd=======");
}
else
{
System.out.println("======wwwwwwwwwww");
}
}
});
this.btnRead.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// 每一次必须把数据清空,保证纯洁
data.clear();
// 从数据库中获取数据,添加方式如下
// data=userInfoService.findAll();//不能更新页面
// 必须如下
data.addAll(userInfoService.findAll());
//当数据发生改变的时候,唤醒适配器
adapter.notifyDataSetChanged();
}
});
// 点击某一项,获取数据
this.listUsers.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView> parent, View view,
int position, long id)
{
//集合框架重新了Object的toString方法
HashMap item=data.get(position);
//Toast.makeText(MainActivity.this, "===click:"+item.toString(), 1000).show();
Intent intent=new Intent(MainActivity.this, UserEditActivity.class);
intent.putExtra("info", item);
// startActivity(intent);
// 修改操作 必须使用
startActivityForResult(intent, 101);
}
});
// 长按事件
this.listUsers.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView> parent, View view,
final int position, long id)
{
// HashMap item=data.get(position);
// Toast.makeText(MainActivity.this, "longClick:"+item.toString(), 1000).show();
//表示是否跳过后续事件,false 表示不跳过,true表示跳过
//一切以结果为导向,厚道
AlertDialog.Builder alert=
new AlertDialog.Builder(MainActivity.this);
alert.setTitle("提示");
alert.setMessage("请冷静,是否确定删除?删除后无法恢复!!!");
alert.setPositiveButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
HashMap item=data.get(position);
boolean flag=userInfoService.doDelete(item);
if(flag){
//建议你重新获取数据,
// 在android+web项目中数据库放在web项目中,可能会出现
// 其他人把数据改了
data.remove(position);
adapter.notifyDataSetChanged();
}
}
});
alert.setNegativeButton("取消", null);
alert.setCancelable(false);
alert.show();
return true;
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==200)
{
switch (requestCode)
{
case 101:
// 重新获取数据
adapter.notifyDataSetChanged();
break;
default:
break;
}
}
}
}
data=userInfoService
data.addAll(userInfoService.finaAll());
四、实现网络通信
通过Android app访问Web资源
(1)必须提供访问网络的权限
(2)访问网络需要耗时,需要开启一个线程独立完成访问网络的操作。
(3)线程之间数据的通信。
API:
百度store
聚合数据
图 4.1
图 4.2
图 4.3
JSON:javascript对象导航。
(1)格式化语言 :{"name","zhangsan"}
大括号表示对象,冒号前面的属性名,后面是属性值。多个属性之间使用逗号分隔,例如:
{"name":"zhangsan","pwd":"123456"}
String json="{\"name\":\"zhangsan\","
+"\"stu\":{\"n\":\"123\"}"
+"\"tels\":[123456,2345,21222]"
+"\"address\":[{\"name\":\"qingdao\",\"code\":\"123\"}]"
+"}";
//把json格式的数据转为java识别的对象
try
{
JSONObject obj=new JSONObject(json);
String str=obj.getString("name");
JSONObject stu=obj.getJSONObject("stu");
String n=obj.getString("n");
int []tels=(int [])obj.get("tles");
JSONArray array=obj.getJSONArray("address");
for(int i=0;i
(1)创建请求对象,可以使HttpGet或HttpPost
String url="http:\\www.baidu.com?city="QingDao""
HttpGet get=new HttpGet(uri);
(2)创建执行的对象
HttpClient client=new DefaultHttpClient();
(3)执行请求并获取结果。
HttpResponse response=client.execute(get);
(4)判断是否成功,只有响应码为200的时候,才可以处理数据。
if(response.getStatusLine().getStatusCode()==200)
{
String str=EntityUtils.toString(response.getEntity());
}
注意:必须添加权限才可以,否则无法使用。
注意:必须提供网络访问的权限。在Android处理返回的json格式的数据。
JSONObject json=new JSONObject(str);
String n=json.getString("属性名");
JSONObject obj=json.getJSONObject("属性名");
获取的是数组:
String [] names=json.get("属性名");
JsonArray array=json.getJSONArray("属性名");
在Android中所有程序的运行都是以单线程执行的。为了避免出现页面反应迟钝的问题,必须把一些耗时操作单独开启一个线程。
子线程中不能直接操作主线程中的控件。
进程:每一个程序对应一个进程。
线程:是进程中执行任务的一个分支。
Java中构建线程。
Thread thread=new Thread(new Runnable(){
public void run()
{
//执行我们的任务
}
});
(a)通过消息机制,在一个线程中向另一个线程发送消息。
(b)Handler
Handler handler=new Handler()
{
//负责接受传递过来的数据并处理,写在主线程中
public void handleMessage(Message msg)
{
}
};
在子线程中通过handler.sendMessage(msg)发送消息。
msg.what用于判断是那个线程发的消息。
msg.obj表示线程发送的消息。
创建消息的载体
Message msg=new Message();
msg.what=1;
msg.obj=i;
handler.sendMessage(msg);
switch(msg.what)
{
case 1:
textMsg.setText(msg.obj.toString());
break;
default:
break;
}