Android切近实战(五)

简介:

OK,我们这次是要把这个界面翻成Android版,大家看过我的博客都知道我一直都是拿这几个界面再弄,

什么java实战篇也是用这个界面,唉,没办法,我只有这个界面。

wKiom1OGAtSztHyBAAFTqAjWxa0631.jpg

先上一张Android版的图,吊胃口,下面的这张是模拟器上的图,怎么样,还像个app的样子吧。

wKiom1OGAprjMjI-AAKcvMfEp6E760.jpg

首先我们来看一下.net webService端,在webService中我新增了一个方法

1
2
3
4
5
  [WebMethod]
         public  CommonResponse UserInfoModify(UserInfoEntity userInfoEntity)
         {
             return  UserInfoBiz.GetInstance().ModifyUserInfo(userInfoEntity);
         }

接下里看一下Biz层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  CommonResponse ModifyUserInfo(UserInfoEntity userInfoEntity)
         {
             try
             {
                 int  suc = UserInfoMngDAL.GetInstance().ModifyUserInfo(userInfoEntity);
 
                 if  (suc > 0)
                 {
                     return  new  CommonResponse() { IsSuccess =  true  };
                 }
 
                 return  new  CommonResponse() { IsSuccess =  false , ErrorMessage = SaveFailed };
             }
             catch  (Exception ex)
             {
                 return  new  CommonResponse() { IsSuccess =  false , ErrorMessage = ex.Message };
             }
         }

最后看一下DAL层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  public  int  ModifyUserInfo(UserInfoEntity userInfoEntity)
         {
             using  (BonusEntities bonusEntities =  new  BonusEntities())
             {
                 if  (bonusEntities.UerInfo.Any(u => u.UseNo == userInfoEntity.UserNo))  //has existed
                 {
                     UerInfo uerInfoModify = bonusEntities.UerInfo.SingleOrDefault(u => u.UseNo == userInfoEntity.UserNo);
                     uerInfoModify.Name = userInfoEntity.UserName;
                     uerInfoModify.Sex = userInfoEntity.UserSex ==  "男"  "1"  "2" ;
                     uerInfoModify.Age = userInfoEntity.UserAge;
                     uerInfoModify.Temper = userInfoEntity.Temper;
                     uerInfoModify.BirthDay = DateTime.Parse( string .Concat(userInfoEntity.BirthDay,  " 00:00:01" ));
 
                     if  (! string .IsNullOrWhiteSpace(userInfoEntity.UserPhoto))
                     {
                         uerInfoModify.Photo = Convert.FromBase64String(userInfoEntity.UserPhoto);
                     }
                 }
                 else
                 {
                     UerInfo uerInfo =  new  UerInfo();
                     uerInfo.UseNo = userInfoEntity.UserNo;
                     uerInfo.Name = userInfoEntity.UserName;
                     uerInfo.Sex = userInfoEntity.UserSex ==  "男"  "1"  "2" ;
                     uerInfo.Age = userInfoEntity.UserAge;
                     uerInfo.Temper = userInfoEntity.Temper;
                     uerInfo.BirthDay = DateTime.Parse( string .Concat(userInfoEntity.BirthDay,  " 00:00:01" ));
 
                     if  (! string .IsNullOrWhiteSpace(userInfoEntity.UserPhoto))
                     {
                         uerInfo.Photo = Convert.FromBase64String(userInfoEntity.UserPhoto);
                     }
                     bonusEntities.UerInfo.Add(uerInfo);
                 }
 
                 return  bonusEntities.SaveChanges();
             }
         }

非常的简单,如果存在就是修改,否则是新建。在这里需要注意的是下面这句

1
uerInfo.Photo = Convert.FromBase64String()

这个解释的话先看一下我们的EF实体

wKiom1OGBQryGo16AAGqOo0Y6s0141.jpg

我们的Photo是byte[]类型,因为Ksoap是无法传递byte[]的,所以在android客户端,我们要先将byte[]编码成string,然后在.net wenservice端再反编码。好了,这里就是webservice端。


接着就到了我们的android客户端了,他才是我们这篇文章的重头戏。先上一张真机上的图,开启笔记本wifi,手机连接wifi,更换代码中的IP,OK,运行

wKiom1OGCJfgeY8XAAGOseUdfQI943.jpg

就是这张图,大家可能会问,那右边的那个东西是什么,是鸟的翅膀吗,不是,是一个人

wKioL1OGCLbi6bUFAAGA2L_pTj0778.jpg

这边的功能是如果用户勾选checkBox,则保存的时候会将图片一并提交webservice去做保存。


图也看了,那么先看一下页面布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "fill_parent"  android:layout_height= "fill_parent" >
     <HorizontalScrollView android:layout_height= "wrap_content"
         android:layout_width= "fill_parent"
         android:scrollbarAlwaysDrawHorizontalTrack= "false" >
         <TableLayout android:layout_width= "wrap_content"
             android:layout_height= "wrap_content"  android:background= "@color/blue1"
             android:stretchColumns= "0" >
             <TableRow>
                 <TableLayout android:layout_width= "wrap_content"
                     android:layout_height= "wrap_content"  android:stretchColumns= "1"
                     android:padding= "3dp"  android:layout_column= "0"
                     android:layout_margin= "1dp"  android:background= "@color/teal" >
                     <TableRow>
                         <TextView android:text= "@string/userName"
                             android:gravity= "right"  android:textSize= "8pt" ></TextView>
                         <EditText android:id= "@+id/txtUserName"
                             android:drawableLeft= "@drawable/userhint"  android:hint= "@string/hintInputUserName"
                             android:textColorHint= "@color/hintColor"  android:width= "200dp"
                             android:singleLine= "true"  android:maxLength= "25" ></EditText>
                     </TableRow>
                     <TableRow>
                         <TextView android:text= "@string/userSex"
                             android:layout_gravity= "center_vertical"  android:textSize= "8pt" >
                         </TextView>
                         <Spinner android:id= "@+id/cmbUserSex"
                             android:layout_width= "fill_parent"  android:layout_height= "wrap_content" ></Spinner>
                     </TableRow>
                     <TableRow>
                         <TextView android:text= "@string/userAge"  android:gravity= "right"
                             android:textSize= "8pt" ></TextView>
                         <EditText android:id= "@+id/txtUserAge"  android:editable= "false" ></EditText>
                     </TableRow>
                     <TableRow>
                         <TextView android:text= "@string/userBirthDay"
                             android:gravity= "right"  android:textSize= "8pt"
                             android:layout_gravity= "center_vertical" ></TextView>
                         <LinearLayout android:layout_width= "wrap_content"
                             android:layout_height= "wrap_content"  android:orientation= "horizontal" >
                             <EditText android:id= "@+id/txtUserBirthDay"
                                 android:editable= "false"
                                 android:layout_width= "wrap_content"  android:layout_height= "wrap_content"
                                 android:width= "140dp"  android:hint= "@string/hintChooseBirth"
                                 android:textColorHint= "@color/hintColor"  android:drawableLeft= "@drawable/calander"
                                 android:singleLine= "true" ></EditText>
                             <Button android:id= "@+id/btnChoose"  android:layout_width= "80dp"
                                 android:layout_height= "45dp"  android:drawableLeft= "@drawable/pencil"
                                 android:layout_gravity= "center_vertical"  android:text= "@string/btnChoose"
                                 android:textStyle= "bold" ></Button>
                         </LinearLayout>
                     </TableRow>
                     <TableRow>
                         <TextView android:text= "@string/userTemper"
                             android:gravity= "right"  android:textSize= "8pt"
                             android:layout_gravity= "center_vertical" ></TextView>
                         <RadioGroup android:id= "@+id/radioGroup"
                             android:contentDescription= "脾气"  android:layout_width= "wrap_content"
                             android:orientation= "horizontal"  android:layout_height= "wrap_content" >
                             <RadioButton android:layout_width= "wrap_content"
                                 android:textColor= "@color/red1"  android:layout_height= "wrap_content"
                                 android:id= "@+id/radioTemper1"  android:text= "@string/userTemper1"
                                 android: checked = "true" ></RadioButton>
                             <RadioButton android:layout_width= "wrap_content"
                                 android:textColor= "@color/red1"  android:layout_height= "wrap_content"
                                 android:id= "@+id/radioTemper2"  android:text= "@string/userTemper2" ></RadioButton>
                         </RadioGroup>
                     </TableRow>
                     <TableRow>
                         <LinearLayout android:orientation= "horizontal"
                         android:layout_height= "wrap_content"
                         android:layout_width= "wrap_content"
                         android:layout_span= "2" >
                             <Button
                                 android:id= "@+id/btnSave" 
                                 android:text= "@string/btnSave" 
                                 android:textColor= "@color/blue"
                                 android:layout_width= "wrap_content"
                                 android:layout_height= "wrap_content"
                                 android:layout_weight= "1"
                                 android:textStyle= "bold" ></Button>
                             <Button android:text= "@string/btnCancelText"
                                 android:layout_width= "wrap_content"
                                 android:layout_height= "wrap_content"
                                 android:layout_weight= "1"
                                 android:id= "@+id/btnCancel"
                                 android:textColor= "@color/blue"  android:textStyle= "bold"
                                 ></Button>
                         </LinearLayout>
                     </TableRow>
                 </TableLayout>
                 <TableLayout android:layout_width= "wrap_content"
                     android:background= "@color/teal"  android:layout_margin= "1dp"
                     android:layout_height= "wrap_content"  android:layout_column= "1" >
                     <TableRow>
                         <ImageView android:id= "@+id/imgUserPhoto"
                             android:background= "@color/imgBg"  android:layout_marginLeft= "10dp"
                             android:layout_marginTop= "5dp"  android:layout_marginRight= "5dp"
                             android:layout_width= "160dp"  android:layout_height= "240dp"
                             android:src= "@drawable/deaultphoto"  android:scaleType= "fitCenter"
                             android:layout_span= "2"  />
                     </TableRow>
                     <TableRow>
                         <CheckBox android:id= "@+id/chkChoosePhoto"
                             android:layout_marginLeft= "10dp"  android:layout_column= "0" ></CheckBox>
                         <Button android:id= "@+id/btnBrowser"  android:text= "@string/btnChoosePhoto"
                             android:textStyle= "bold"  android:layout_width= "150dp"
                             android:layout_height= "45dp"  android:layout_marginTop= "1dp"
                             android:textColor= "@color/blue"  android:layout_column= "1" ></Button>
                     </TableRow>
                 </TableLayout>
             </TableRow>
         </TableLayout>
     </HorizontalScrollView>
</LinearLayout>


布局的话主要有以下几点,第一,这个布局总体采用TableLayout,因为我们的界面的宽度的缘故,所以我在table的外层加了个HorizontalScrollView,用来左右滚动。第二,这个界面的布局是采用左右各占一列, 在列中又嵌套了Table。做过Silverlight的人都知道,Grid布局是很好用的,这个和Silverlight的Grid布局有点像。布局的话其实都很简单,也没啥看点。


在界面中,大家都看到了有个下拉列表样子的东西,那是什么,是ComboBox?我靠,你以为这是在做Silverlight呢。这个是Android中的Spinner控件。我们来看一下他是如何加载下拉数据和响应事件的。

首先我们在string.xml文件中新增了一个string-array资源,用来加载到下拉列表。


wKioL1OGCzfS-RN5AAKfu2-DjPI708.jpg


在代码中,我们会构造一个Spinner加载数据的一个适配器,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private  void  InitData() {
         // ArrayAdapter<String> adapter;
         // adapter = new ArrayAdapter<String>(this,
         // android.R.layout.simple_spinner_item, sexArray);
 
         final ArrayAdapter<?> adapter = ArrayAdapter.createFromResource( this ,
                 R.array.sexArray, android.R.layout.simple_spinner_item);
         adapter
                 .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         spnUserSex.setAdapter(adapter);
 
         // spnUserSex.setOnItemSelectedListener(new OnItemSelectedListener() {
         // public void onItemSelected(AdapterView<?> arg0, View arg1,
         // int arg2, long arg3) {
         // String selectedItem = adapter.getItem(arg2).toString();
         // }
         //
         // public void onNothingSelected(AdapterView<?> arg0) {
         // }
         // });
     }

看到了吧,那句R.Array.SexArray就是从资源文件取出性别集合的。

1
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

这句是表示我们的下拉列表展示简单的项(只有文子字),如果你想让你的下拉列表更生动,你可以去加载模版,比如在男选项前面放一个男人头像,女选项前面放一个女头像。这个其实和Silverlight的ComboBox的模版类似。OK,最后给Spinner设置适配器。我注释的上面部分是当不从资源文件加载数据的时候的代码,下面部分是下拉事件响应的代码。我们看一下下拉效果

wKioL1OGDUGQvS8iAAEfU4r7-Bk634.jpg


此时,就可以在界面选择你想要的结果。

wKioL1OGDe7w5fvnAADlOSDNTcY537.jpg

好了,那我们接下来看这个出生日期,为什么要先看出生日期呢,因为年龄是根据出生日期算出来的,难道您刚才没注意那个年龄的文本框是设置为不能编辑的吗(android:editable="false")。

出生日期后面的那个选择按钮完成的功能是弹出日期选择界面。看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
this .btnChoose.setOnClickListener( new  OnClickListener() {
             public  void  onClick(View view) {
                 Calendar calendar = Calendar.getInstance();
                 DatePickerDialog dialog =  new  DatePickerDialog(owner,
                         new  DatePickerDialog.OnDateSetListener() {
                             public  void  onDateSet(DatePicker dp,  int  year,
                                     int  month,  int  dayOfMonth) {
                                 txtBirthDay.setText(year +  "-"  + month +  "-"
                                         + dayOfMonth);
 
                                 SimpleDateFormat df =  new  SimpleDateFormat();
                                 df.applyPattern( "yyyy-MM-dd hh:mm:ss" );
                                 try  {
                                     Date dt = df.parse(year +  "-"  + month +  "-"
                                             + dayOfMonth +  " 00:00:01" );
                                     int  age =  new  Date().getYear()
                                             - dt.getYear();
                                     txtAge.setText(String.valueOf(age));
                                 catch  (ParseException e1) {
                                     // TODO Auto-generated catch block
                                     e1.printStackTrace();
                                 }
                             }
                         }, calendar.get(Calendar.YEAR), calendar
                                 .get(Calendar.MONTH), calendar
                                 .get(Calendar.DAY_OF_MONTH));
 
                 dialog.show();
             }
         });


看到了吧,我们直接弹出android内置的Dialog(DatePickerDialog),看一下效果

wKiom1OGD02RVxVeAAGuB6Ma8Wc217.jpg

在他的日期设置事件(onDateSet)中,我们拿到选择的日期,先赋给出生日期文本框,然后再用当前的年份减去选择的年份,算出来就是年龄,把年龄赋给年龄文本框。如果你想设置初始化的日期的话,需要注意他DatePickerDialog的构造函数最后三个参数,来自API的解释

wKiom1OGEITSRiNsAAFLCFuTgto506.jpg

OK,日期看完之后,就是右边的图片了,首先我们要知道图片从哪里来,当然是从手机里来,是个人都知道。我们看一下点击浏览按钮做的事情。

1
2
3
4
5
6
7
8
this .btnBrowser.setOnClickListener( new  OnClickListener() {
             public  void  onClick(View view) {
                 Intent intent =  new  Intent();
                 intent.setType( "image/*" );
                 intent.setAction(Intent.ACTION_GET_CONTENT);
                 startActivityForResult(intent,  1 );
             }
         });

看到了吧,启动手机的图片照片搜索界面,如下

wKioL1OGEW7jxmW2AAIEdJbz5LE669.jpg

选择一张照片,图片就会显示到图片框中,如下

wKiom1OGEg2AWEy5AAGa5yozDEk805.jpg

那么图片是怎么显示到图片框中的,第一步,我们要重写当前Activity的onActivityResult方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected  void  onActivityResult( int  requestCode,  int  resultCode,
             android.content.Intent data) {
         if  (resultCode == RESULT_OK) {
             Uri uri = data.getData();
             ContentResolver contentResolver =  this .getContentResolver();
             try  {
                 Bitmap bitmap = BitmapFactory.decodeStream(contentResolver
                         .openInputStream(uri));
                 imgUserPhoto.setImageBitmap(bitmap);
             catch  (FileNotFoundException e) {
             }
         }
         super .onActivityResult(requestCode, resultCode, data);
     }

我们拿到图片的资源地址后,转化成Bitmap,赋给图片框。在这里图片框有多种显示拉伸方式,我就不多说了,自己查吧。OK,图片也显示完了,我们看最后的保存。


在看保存之前,我们先看一下取消

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
this .btnCancel.setOnClickListener( new  OnClickListener() {
             public  void  onClick(View view) {
                 final  AlertDialog.Builder builder =  new  AlertDialog.Builder(
                         owner);
                 builder.setIcon(R.drawable.info);
                 builder.setTitle(R.string.titleSystemCodeModifyName);
                 builder.setMessage( "您确定要退出修改吗?" );
                 builder.setPositiveButton(R.string.btnSure,  null );
                 builder.setNegativeButton(R.string.btnCancelText,  null );
 
                 final  AlertDialog dialog = builder.create();
                 dialog.show();
 
                 dialog.getButton(AlertDialog.BUTTON_POSITIVE)
                         .setOnClickListener( new  View.OnClickListener() {
                             @Override
                             public  void  onClick(View v) {
                                 userinfomanage. this .setResult(RESULT_OK);
                                 userinfomanage. this .finish();
                             }
                         });
             }
         });

取消这个很简单,就是构造一个弹出框,点击确定关闭当前Activity,点击取消,不关闭界面

wKiom1OGE_3iMVe0AAGIJrbUHyk357.jpg

OK,最后我们看一下我们的save。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
this .btnSave.setOnClickListener(( new  OnClickListener() {
             public  void  onClick(View view) {
 
                 if  (!CheckUserInput())
                     return ;
 
                 UserInfoEntity userInfoEntity = GetUserInfoEntity();
                 SoapObject soapObject = ModifyUserInfoEntty(userInfoEntity);
 
                 Boolean isSuccess = Boolean.valueOf(soapObject.getProperty(
                         "IsSuccess" ).toString());
 
                 if  (isSuccess) {
                     ShowMessage(R.string.SaveSuccess);
                 else  {
                     String errorMsg = soapObject.getProperty( "ErrorMessage" )
                             .toString();
                     ShowMessage(errorMsg);
                 }
             }
         }));

首先是check,如下,很简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private  Boolean CheckUserInput() {
         String userName =  this .txtUserName.getText().toString().trim();
         if  (userName.length() ==  0 ) {
             this .ShowMessage( "姓名不能为空!" );
             this .txtUserName.requestFocus();
             return  false ;
         }
 
         String birthDay =  this .txtBirthDay.getText().toString().trim();
         if  (birthDay.length() ==  0 ) {
             this .ShowMessage( "出生日期不能为空!" );
             this .btnBrowser.requestFocus();
             return  false ;
         }
 
         return  true ;
     }

接着是拿到要保存的实体GetUserInfoEntity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private  UserInfoEntity GetUserInfoEntity() {
         UserInfoEntity userInfoEntity =  new  UserInfoEntity();
         userInfoEntity.setProperty( 1 , txtUserName.getText().toString());
         userInfoEntity.setProperty( 0 , userNo);
         userInfoEntity.setProperty( 2 , spnUserSex.getSelectedItem());
         userInfoEntity.setProperty( 3 , txtAge.getText());
         userInfoEntity.setProperty( 4 , txtBirthDay.getText());
         userInfoEntity.setProperty( 5 , radiobtnTemper1.isChecked() ?  "1"  "2" );
 
         if  (chkPhoto.isChecked()) {
             String strByte = Base64.encode(GetImageByteArray());
             userInfoEntity.setProperty( 6 , strByte);
         }
         return  userInfoEntity;
     }

需要注意的是这里Base64.encode(GetImageByteArray()),这个就是刚才说的KSoap不支持直接传byte[],而是要转码。GetImageByteArray这个方法是将图片框中的图片转化成byte[]。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private  byte [] GetImageByteArray() {
         byte [] compressData =  null ;
         imgUserPhoto.setDrawingCacheEnabled( true );
         Bitmap bmp = Bitmap.createBitmap(imgUserPhoto.getDrawingCache());
         imgUserPhoto.setDrawingCacheEnabled( false );
 
         if  (bmp !=  null ) {
             compressData = GetByteArrayByBitmap(bmp);
         }
         return  compressData;
     }
 
     private  byte [] GetByteArrayByBitmap(Bitmap bmp) {
         byte [] compressData =  null ;
         ByteArrayOutputStream byteOutputStream =  new  ByteArrayOutputStream();
         bmp.compress(Bitmap.CompressFormat.JPEG,  100 , byteOutputStream);
 
         compressData = byteOutputStream.toByteArray();
         try  {
             byteOutputStream.close();
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return  compressData;
     }

这都是固定写法,不多做解释。OK,我们看一下实体的定义,免得看得人摸不着头脑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
public  class  UserInfoEntity  implements  KvmSerializable {
     private  String UserNo;
     private  String UserName;
     private  String UserSex;
     private  int  UserAge;
     private  String BirthDay;
     private  String Temper;
     private  String UserPhoto;
 
     @Override
     public  Object getProperty( int  arg0) {
         // TODO Auto-generated method stub
         Object property =  null ;
         switch  (arg0) {
         case  0 :
             property =  this .UserNo;
             break ;
         case  1 :
             property =  this .UserName;
             break ;
         case  2 :
             property =  this .UserSex;
             break ;
         case  3 :
             property =  this .UserAge;
             break ;
         case  4 :
             property =  this .BirthDay;
             break ;
         case  5 :
             property =  this .Temper;
             break ;
         case  6 :
             property =  this .UserPhoto;
             break ;
         default :
             break ;
         }
         return  property;
     }
 
     @Override
     public  int  getPropertyCount() {
         // TODO Auto-generated method stub
         return  7 ;
     }
 
     @Override
     public  void  getPropertyInfo( int  arg0, Hashtable arg1, PropertyInfo arg2) {
         // TODO Auto-generated method stub
         switch  (arg0) {
         case  0 :
             arg2.type = PropertyInfo.STRING_CLASS;
             arg2.name =  "UserNo" ;
             break ;
         case  1 :
             arg2.type = PropertyInfo.STRING_CLASS;
             arg2.name =  "UserName" ;
             break ;
         case  2 :
             arg2.type = PropertyInfo.STRING_CLASS;
             arg2.name =  "UserSex" ;
             break ;
         case  3 :
             arg2.type = PropertyInfo.INTEGER_CLASS;
             arg2.name =  "UserAge" ;
             break ;
         case  4 :
             arg2.type = PropertyInfo.STRING_CLASS;
             arg2.name =  "BirthDay" ;
             break ;
         case  5 :
             arg2.type = PropertyInfo.STRING_CLASS;
             arg2.name =  "Temper" ;
             break ;
         case  6 :
             arg2.type = PropertyInfo.STRING_CLASS;
             arg2.name =  "UserPhoto" ;
             break ;
         default :
             break ;
         }
     }
 
     @Override
     public  void  setProperty( int  arg0, Object arg1) {
         // TODO Auto-generated method stub
         if  (arg1 ==  null )
             return ;
         switch  (arg0) {
         case  0 :
             this .UserNo = arg1.toString();
             break ;
         case  1 :
             this .UserName = arg1.toString();
             break ;
         case  2 :
             this .UserSex = arg1.toString();
             break ;
         case  3 :
             this .UserAge = Integer.parseInt(arg1.toString());
             break ;
         case  4 :
             this .BirthDay = arg1.toString();
             break ;
         case  5 :
             this .Temper = arg1.toString();
             break ;
         case  6 :
             this .UserPhoto = arg1.toString();
         default :
             break ;
         }
     }
}

和.net WebServce端是对应的。OK,最后我们看一下保存(ModifyUserInfoEntty)的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private  SoapObject ModifyUserInfoEntty(UserInfoEntity userInfoEntity) {
         SoapObject request =  new  SoapObject(NAMESPACE, METHOD_NAME);
         PropertyInfo pi =  new  PropertyInfo();
         pi.setName( "userInfoEntity" );
         pi.setValue(userInfoEntity);
         pi.setType(userInfoEntity.getClass());
         request.addProperty(pi);
 
         SoapSerializationEnvelope soapEnvelope =  new  SoapSerializationEnvelope(
                 SoapEnvelope.VER11);
         soapEnvelope.dotNet =  true ;
         HttpTransportSE httpTS =  new  HttpTransportSE(URL);
         soapEnvelope.bodyOut = httpTS;
         soapEnvelope.setOutputSoapObject(request); // 设置请求参数
         soapEnvelope.addMapping(NAMESPACE,  "UserInfoEntity" , userInfoEntity
                 .getClass());
         new  MarshalBase64().register(soapEnvelope);
 
         try  {
             httpTS.call(SOAP_ACTION, soapEnvelope);
         catch  (IOException e) {
             // TODO Auto-generated catch block
             this .ShowMessage(e.getMessage());
             // e.printStackTrace();
         catch  (XmlPullParserException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
 
         SoapObject result =  null ;
         try  {
             result = (SoapObject) soapEnvelope.getResponse();
         catch  (SoapFault e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
 
         return  result;
     }

这里需要注意的是new MarshalBase64().register(soapEnvelope);这是要告诉soap 信使message中包含有Base64转过的byte[]。OK,最后,我们鼓起勇气点击save。

wKiom1OGFp6RVPlfAAGPC9yXtxA485.jpg

走起,见证奇迹的时刻

wKioL1OGFs6SjmyMAAFsjF0FDoc433.jpg

yeah,成功了,图片是否成功我们需要借助C#版的程序看一下,成功了。

wKiom1OHPoTDxpdrAAK7Kl5LEnQ210.jpg

最后,哥们这博客可真是货真价实,中兴U880S测试机。

wKiom1OGGPyiPImDAAFG60n04Aw032.jpg


本文转自 BruceAndLee 51CTO博客,原文链接:http://blog.51cto.com/leelei/1418886,如需转载请自行联系原作者


相关文章
|
3天前
Android4.1.0实战教程---自动阅读小说
Android4.1.0实战教程---自动阅读小说
44 0
|
20小时前
|
前端开发 Android开发
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
|
1天前
|
Android开发
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
|
1天前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
1天前
|
设计模式 Android开发 Java
实战案例,精选Android面试真题集锦
实战案例,精选Android面试真题集锦
|
3天前
|
缓存 Java Android开发
Android应用性能优化实战
【5月更文挑战第14天】 在竞争激烈的应用市场中,一个流畅、高效的应用能显著提升用户体验并增强用户黏性。本文深入探讨了针对安卓平台进行应用性能优化的策略与实践,从内存管理到多线程处理,再到布局渲染和网络请求的优化,旨在为开发者提供一套全面的优化工具箱。通过分析常见的性能瓶颈并结合最新的Android技术动态,我们不仅讨论理论,还将分享具体的代码示例和改进方法,帮助开发者在实际应用中实现性能提升。
|
3天前
|
编解码 缓存 监控
安卓应用性能优化实战
【5月更文挑战第14天】 在当今移动应用竞争激烈的市场中,一款应用的性能直接影响用户体验和留存率。特别是对于安卓平台,由于设备多样性和应用生态环境的复杂性,性能优化显得尤为重要。本文将深入探讨安卓应用的性能瓶颈,分析影响性能的关键因素,并通过具体的代码实践和工具使用,展示如何有效提升安卓应用的响应速度和流畅度。内容覆盖从UI渲染优化、内存管理到电池使用效率的多个方面,旨在为开发者提供一套实用的性能优化策略。
|
3天前
|
移动开发 API Android开发
Android应用性能优化实战
【4月更文挑战第28天】在移动开发领域,一个流畅的用户体验是至关重要的。对于Android开发者而言,应用的性能优化是一项既挑战性也极其重要的工作。本文将深入探讨Android应用性能优化的多个方面,包括内存管理、UI渲染、多线程处理以及电池效率等,旨在为开发者提供实用的性能提升策略和具体的实施步骤。通过分析常见的性能瓶颈,并结合最新的Android系统特性和工具,我们的目标是帮助读者打造更加高效、响应迅速的Android应用。
|
3天前
|
缓存 监控 Android开发
Android 应用性能优化实战
【4月更文挑战第27天】 在竞争激烈的移动应用市场中,性能优越的应用更能吸引和保留用户。针对Android平台,本文将深入探讨影响应用性能的关键因素,并提供一系列实用的优化策略。我们将从内存管理、UI渲染、多线程处理以及电池使用效率等方面入手,通过具体案例分析如何诊断常见问题,并给出相应的解决方案。文中所提技巧旨在帮助开发者构建更加流畅、高效的Android应用。
24 2
|
3天前
|
缓存 移动开发 Android开发
构建高效Android应用:内存优化实战指南
【4月更文挑战第25天】 在移动开发领域,应用程序的性能至关重要。特别是对于Android设备,由于硬件配置的多样性,合理的内存管理与优化是提升应用流畅度、减少卡顿和崩溃的关键。本文将深入探讨Android应用的内存优化技巧,通过分析内存泄漏的原因、诊断工具的运用以及实际代码层面的改进措施,帮助开发者构建更加高效的Android应用。