生产实习(Android)八

一、如何导入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"/>


(2)为ListView添加布局。新建一个Android Layout XML File。用于标明ListView中各个数据的排列方式。


图3.1

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


(3)显示如下:

图 3.2
如何向ListView中添加数据:

(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+"%");
}


(3)创建UserInfoService层:

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 block
		e.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 block
		e.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});
//		把适配器 添加到ListView
	listUsers.setAdapter(adapter);
}

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

		@Override
		public 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()
			{

				@Override
				public 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;
		}
	});
}
	
@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<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;
}


附:线程、网络通信,都不用,面试必考。
































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值