生产实习(Android)八
来源:互联网 发布:ubuntu 16.04 torrent 编辑:程序博客网 时间:2024/04/29 09:20
一、如何导入jar文件:
(1)Build path添加,添加的是本地jar,如果项目拷走,在其它电脑中没有jar文件会报错。
(2)直接把jar文件copy到libs中,方便移植,工具会自动把libs中的jar文件添加到构建文件中。
二、Android开发中常用的常量:
(1)String类型:都要写入在res/values/string.xml
普通字符串:<string name="">value</string>
(2)创建数组:<string-array name="">
<item>value1</item>
</string-array>
(3)Color颜色:要写在res/values/colors.xml
<color name="">#ffffff</color>
(4)Dimen尺寸:在res/values/dimens.xml
<dimen name="">20dp</dimen>
三、ListView:列表视图
它会随着内容的增加,高度和宽度会改变。如果内容超出了范围,会自动添加滚动条。ListView在显示时需要一个布局文件来呈现每一行中的内容。
要确定ListView中每一行显示数据的格式。
(1)添加"读入""写入"按钮,实现数据库的读取,在添加ListView按钮。ListView按钮用于显示从数据库读取的数据。
例:
<Button android:id="@+id/button_read" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="26dp" android:layout_marginTop="40dp" android:text="read" /> <Button android:id="@+id/button_write" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button_read" android:layout_alignBottom="@+id/button_read" android:layout_alignParentRight="true" android:layout_marginRight="47dp" android:text="write" /> <ListView android:id="@+id/main_list_info" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/button_write"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/main_list_item_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="101" android:layout_weight="1" android:layout_marginTop="10dp"/> <TextView android:id="@+id/main_list_item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="zhangsan" android:layout_weight="3" android:layout_marginTop="10dp"/> <TextView android:id="@+id/main_list_item_sex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="male" android:layout_weight="2" android:layout_marginTop="10dp"/></LinearLayout>
(1)创建ListView中每一行数据的布局文件。
(2)创建向ListView中要显示的数据。
(3)数据的格式是List<Map<String,String>>或者List<HashMap<String,String>>。
(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<HashMap<String,String>> 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<HashMap<String,String>>();HashMap<String,String>item=null;for(int i=0;i<10;i++){ //注意每循环一次都要重新创建该对象,保证数据不重复item=new HashMap<String,String>();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<Map<String,String>>格式数据,用于页面显示 * resource:指明ListView中每行数据显示的布局文件 * from:把Map中的那些key用于页面显示,是一个String类型的数组 * to:指的是布局文件中的id,顺寻要与from中指明的key一致 * 是一个int类型的数组 */ adapter=new SimpleAdapter(this, data, R.layout.main_list_user_item, new String[]{"user_id","user_name","user_sex"}, new int[]{R.id.main_list_item_id, R.id.main_list_item_name, R.id.main_list_item_sex}); //把适配器添加到ListView listusers.setAdapter(adapter);}运行效果:
图 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<HashMap<String, String>> findAll(){String sql="select user_id,user_name,user_sex "+ " from user_info order by user_id desc";return super.executeQuery(sql);}//模糊查询public List<HashMap<String, String>> 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<HashMap<String, String>> findAll(){List<HashMap<String, String>> data=null;try {data=this.userInfoDao.findAll();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return data;}public boolean doDelete(HashMap<String,String> item){boolean flag=false;try {this.userInfoDao.delete(item.get("user_id"));flag=true;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return flag;}
(4)MainActivity代码如下:
4.1、初始化:
private Button btnRead;private Button btnWrite;private UserInfoService userInfoService;private ListView listUsers;//使用HashMap的原因,HashMap可以通过Intent进行数据的传递private List<HashMap<String, String>> 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<HashMap<String,String>>();//ListView 本身不识别 该格式的数据//此时此刻,需要一个转换器(适配器) 把List数据转换为ListView可以识别的格式//context :上下文,表示该对象在哪个页面中创建,属于哪一个项目//data:List<Map<String,String>>格式的数据,用于页面显示//resource:指明ListView中每一行数据显示的布局文件//from:把Map中的那些key用于页面显示,是一个String类型的数组//to:指的布局文件中的控件的id,顺序要与from中指明的key一致//是一个int类型的数组//adapter=new SimpleAdapter(context, data, resource, from, to);adapter=new SimpleAdapter(this, data, R.layout.main_list_user_item,//其中的数据,对应的是表中的列名new String[]{"user_id","user_name","user_sex"},new int[]{R.id.main_list_item_id, R.id.main_list_item_name, R.id.main_list_item_sex});//把适配器 添加到ListViewlistUsers.setAdapter(adapter);}
4.2、添加事件:
private void setListener() {this.btnWrite.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View v){//每一次必须把数据清空,保证纯洁data.clear();//从数据库中获取数据,添加方式如下//data=userInfoService.findAll();//不能更新页面//必须如下data.addAll(userInfoService.findAll());//当数据发生改变的时候,唤醒适配器adapter.notifyDataSetChanged();}});//点击某一项,获取数据this.listUsers.setOnItemClickListener(new AdapterView.OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {//集合框架重新了Object的toString方法HashMap<String, String> 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() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,final int position, long id) {//HashMap<String, String> 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(){@Overridepublic void onClick(DialogInterface dialog, int which) {HashMap<String, String> 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;}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.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<array.length();i++){JSONObject jo=array.getJSONObject(i);}} catch (JSONException e) {e.printStackTrace();}
在android中范文Web程序的步骤:
(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;}
附:线程、网络通信,都不用,面试必考。
- 生产实习(Android)八
- 生产实习(Android)一
- 生产实习(Android)二
- 生产实习(Android)三
- 生产实习(Android)四
- 生产实习(Android)五
- 生产实习(Android)六
- 生产实习(Android)七
- 我的生产实习日志(八)
- 生产实习日志
- IOS生产实习知识
- 实习日志(八)
- 实习见闻(八)
- 金蝶实习(八)
- 实习日记八、JSTL
- 实习整理(八)
- 汕头公司生产实习一天游
- 我的生产实习日志(一)
- sqlserver事务处理
- opencv java中打开视频问题
- socket的应用
- 解决android studio卡的办法
- 从数据类型varchar转换为real时出错
- 生产实习(Android)八
- Linux学习三
- 画笔与画布类
- java中的抽象类和接口
- RTSP 协议分析
- 类重载全局函数指针
- bzoj1927[Sdoi2010]星际竞速
- MyEclipse8.5破解方法
- ubuntu系统上phabricator安装与配置