无线点餐进行时……(结束)
学习中的小问题,集中更新,因不爱看视频慢慢来,在做项目中的一系列问题,喜欢在项目中进行解决(也许有些很脑残)- -
- 自定义控件
就是在lisetview中添加各种控件,这个小伙伴都会吧 - -,其中就是一个小小的问题。listview焦点问题,在listview中植入自定义控件会发生的一个焦点问题,导致无法点击自定义控件的button按钮,
beforeDescendants:viewgroup会优先其子类控件而获取到焦点 。
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点 。
一般使用 beforeDescendants:viewgroup 加在layout布局文件中,从而获得焦点。
- viewpager和fragment
一个activity类和一个adapter类,还插入了一个RadioButton的按钮也以用来控制页面的跳转,本来是有参考大大的博客的,但是没保存…..
activity类:
package com.example.gmproject;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class menuMain extends FragmentActivity{
private ViewPager view;
private checkAdapter adapter;
private RadioGroup radiogroup;
private RadioButton tb1,tb2,tb3,tb4;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.menu);
intiView();
addAdpter();
}
public void intiView(){
view = (ViewPager) findViewById(R.id.viewpager);
radiogroup = (RadioGroup) findViewById(R.id.radiogroup);
tb1 = (RadioButton) findViewById(R.id.tab1);
tb2 = (RadioButton) findViewById(R.id.tab2);
tb3 = (RadioButton) findViewById(R.id.tab3);
tb4 = (RadioButton) findViewById(R.id.tab4);
}
public void addAdpter(){
adapter = new checkAdapter(getSupportFragmentManager());
view.setAdapter(adapter);
view.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
switch (arg0) {
case 0:
tb1.setChecked(true);
tb2.setChecked(false);
tb3.setChecked(false);
tb4.setChecked(false);
break;
case 1:
tb1.setChecked(false);
tb2.setChecked(true);
tb3.setChecked(false);
tb4.setChecked(false);
break;
case 2:
tb1.setChecked(false);
tb2.setChecked(false);
tb3.setChecked(true);
tb4.setChecked(false);
break;
case 3:
tb1.setChecked(false);
tb2.setChecked(false);
tb3.setChecked(false);
tb4.setChecked(true);
break;
}
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
radiogroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.tab1:
view.setCurrentItem(0);//返回VIEW中的界面0,1,2,3
break;
case R.id.tab2:
view.setCurrentItem(1);
break;
case R.id.tab3:
view.setCurrentItem(2);
break;
case R.id.tab4:
view.setCurrentItem(3);
break;
}
}
});
}
}
adapter类:
package com.example.gmproject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.rtp.RtpStream;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
public class checkAdapter extends FragmentPagerAdapter {
public checkAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 4;// 页面数量
}
public Fragment getItem(int position) {
switch (position) {
case 0:
return new CheckItemFragment1();
case 1:
return new CheckItemFragment2();
case 2:
return new CheckItemFragment3();
case 3:
return new CheckItemFragment4();
default:
return null;
}
}
public static class CheckItemFragment1 extends Fragment {
}
public static class CheckItemFragment2 extends Fragment {
}
public static class CheckItemFragment3 extends Fragment {
}
public static class CheckItemFragment4 extends Fragment {
}
}
}
这样就能实现viewpage和rediobutton进行页面控制了然后在viewpage中嵌套fragment ,使用fragment应该要看好他的生命周期,什么会被销毁,什么会被缓存(吃了一波大亏 T T)。
- webservice发布IIS
让andorid连接webservice尽量将webservice发布到IIS上不然会出现一系列连接问题,在模拟器上是不能使用localhost的模拟器想要访问本地是10.0.2.2但是也会出现很多问题,在连接tomacat可以使用电脑的默认IP地址,但是在我连接webservice貌似也出现了连接不上的问题,所以IIS最靠谱 - - ,一个小插曲webservice连接了数据库,sqlserver数据库不要用windows验证模式,不然IIS是连接不上数据库的。
webservice的代码(用C#写的webservice):
using System;
using System.Data.SqlClient;
using System.Collections.Generic;
namespace Webservice
{
public class DBopen :IDisposable
{
public static SqlConnection sqlcont;//连接数据库
//连接数据库字符串
private String content = @"Data Source=HP-PC\LOL;Initial Catalog=C_order;Persist Security Info=True;User ID=sa;Password=2518598";
//创建一个构造函数
public DBopen(){
//判断数据库是否连接
if (sqlcont == null){
//连接数据库
sqlcont = new SqlConnection();
sqlcont.ConnectionString = content;
sqlcont.Open();
}
//关闭数据库重连
else {
sqlcont.Close();
sqlcont = new SqlConnection();
sqlcont.ConnectionString = content;
sqlcont.Open();
}
}
//创建一个增加数据的方法
///<param name="C_id">食物ID</param>
/// <param name="C_name">食物名称</param>
/// <param name="C_num">食物数量</param>
/// <param name="C_price">食物价格</param>
public bool insertCargoInfo( string C_name, int C_num , int C_price)
{
try
{
string sql = "insert into To_order (C_name,C_num,C_price) values (" +"'"+ C_name +"'"+"," + C_num + "," + C_price + ")";
SqlCommand cmd = new SqlCommand(sql, sqlcont);
cmd.ExecuteNonQuery();
cmd.Dispose();
return true;
}
catch (Exception)
{
return false;
}
}
//创建一个list获取所有的数据
public List<string> selectAllData() {
List<string> list = new List<string>();
try {
string sql = "select * from To_order";
SqlCommand cmd = new SqlCommand(sql,sqlcont);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
//结果返回其中
list.Add(reader[0].ToString());
list.Add(reader[1].ToString());
list.Add(reader[2].ToString());
}
reader.Close();
cmd.Dispose();
}
catch (Exception){
}
return list;
}
public void Dispose()
{
throw new NotImplementedException();
}
void IDisposable.Dispose()
{
throw new NotImplementedException();
}
}
}
参考大大的博客有:
webservice的创建和发布
http://blog.sina.com.cn/s/blog_45eaa01a0102vopl.html
- andoroid 连接 webservice
连接方法使用koap2协议,首先下载一个第三方包。
webservice是用C#写的,所以在android代码中 加上 envelope.dotNet = true;
andorid访问网络需要注册网络权限,在AndroidManifest.xml中加入
安卓主程序反应时间5秒(貌似是这个意思)所以,连接webservice不能写在主程序中,要使用异步或者是子线程(3.0以上版本)。
连接webservcie需要 注意版本协议号,SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER10);
协议号看webservice服务说明,这是1.0版本
《?xml version=”1.0” encoding=”UTF-8”?>
低版本不能向高版本兼容,不然会报XML解析错误,(最后的一个问题了,终于能实现一个雏形了….)
static String URL = "http://192.168.123.39/web/WebService1.asmx?WSDL";
static String server_rul = "http://FristLwAmf.org/";
static String SelectMethName = "selectAllCargoInfor";
static String InsertMethname = "insertCargoInfo";
// 执行异步
class wsasynctask extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
String name, num, price;
name = CheckItemFragment1.this.name.getText().toString();
num = CheckItemFragment1.this.num.getText().toString();
price = CheckItemFragment1.this.price.getText().toString();
// 准备webservice
// 指定service命名空间和调用方法
SoapObject request = new SoapObject(server_rul, InsertMethname);
// example方法中有一个String的参数,这里将“信息”传递到example中(需要传递数据可用)
request.addProperty("FoodName", name);
request.addProperty("FoodNumber", num);
request.addProperty("FoodPrice", price);
// 创建SoapSerializationEnvelope对象,并指定WebService的版本(指定版本號在wsdl中查詢webservice
// soap1.0)
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER10);
// 设置bodyOut属性
envelope.bodyOut = request;
// c#写的应用程序必须加上这句
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
// 创建HttpTransportSE对象,并指定WSDL文档的URL
AndroidHttpTransport ht = new AndroidHttpTransport(URL);
try {
ht.call(server_rul + InsertMethname, envelope);
SoapObject result = (SoapObject)envelope.getResponse();
count = result.getPropertyCount();// 返回的所有属性值长度
// 获取webservice中的属性返回值
name = result.getProperty(0).toString();
price = result.getProperty(1).toString();
num = result.getProperty(2).toString();
//刷新UI
public void run() {
// TODO Auto-generated method stub
//异步的方法 - -, 可以使用子线程和handler的,偷一波懒
}
} catch (IOException e) {
Toast.makeText(getActivity(), "网络连接异常", 0);
e.printStackTrace();
} catch (XmlPullParserException e) {
Toast.makeText(getActivity(), "XML解析异常", 0);
e.printStackTrace();
}
return null;
}
}
参考大大的博客有:
andorid连接C#webservice:
http://www.cnblogs.com/kissazi2/p/3406662.html
调用webservice中方法,参数和字符串
http://blog.csdn.net/tsingheng/article/details/7817084
- 总结
这个 项目(算项目吗 - - 好歹有客户端,有服务器端好吧…..)到此也就GG了,很多问题看破之后就感觉自己像个傻子T T,向上吧,骚年继续加油咯!!!能看到成果就有做下去的动力,还是坚持不看视频,实操中掌握真理 下一波手机安全卫士吧….希望道路能平坦点。