首先在AndroidManifest.xml设置权限:
<!-- 传头像 --> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
在服务器端加入jar包:commons-fileupload-1.3.1.jar,commons-io-2.4.jar
jar包下载地址:http://pan.baidu.com/s/1mg7gPvi
servlet文件:headerPortaitUploadServlet
1 package com.ghp.servlet; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 import java.util.Iterator; 7 import java.util.List; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 import org.apache.commons.fileupload.DiskFileUpload; 15 import org.apache.commons.fileupload.FileItem; 16 17 import com.ghp.dao.UsersDao; 18 19 public class headerPortaitUploadServlet extends HttpServlet { 20 21 /** 22 * Constructor of the object. 23 */ 24 public headerPortaitUploadServlet() { 25 super(); 26 } 27 28 /** 29 * Destruction of the servlet. <br> 30 */ 31 public void destroy() { 32 super.destroy(); // Just puts "destroy" string in log 33 // Put your code here 34 } 35 36 /** 37 * The doGet method of the servlet. <br> 38 * 39 * This method is called when a form has its tag value method equals to get. 40 * 41 * @param request the request send by the client to the server 42 * @param response the response send by the server to the client 43 * @throws ServletException if an error occurred 44 * @throws IOException if an error occurred 45 */ 46 public void doGet(HttpServletRequest request, HttpServletResponse response) 47 throws ServletException, IOException { 48 49 doPost(request, response); 50 } 51 52 /** 53 * The doPost method of the servlet. <br> 54 * 55 * This method is called when a form has its tag value method equals to post. 56 * 57 * @param request the request send by the client to the server 58 * @param response the response send by the server to the client 59 * @throws ServletException if an error occurred 60 * @throws IOException if an error occurred 61 */ 62 public void doPost(HttpServletRequest request, HttpServletResponse response) 63 throws ServletException, IOException { 64 65 response.setContentType("text/html;charset=utf8"); 66 PrintWriter out = response.getWriter(); 67 //临时目录 68 String temp=request.getSession().getServletContext().getRealPath("/")+"temp"; 69 //上传文件存放目录 70 String loadpath=request.getSession().getServletContext().getRealPath("/")+"headerportaitimages"; 71 DiskFileUpload fu = new DiskFileUpload(); 72 fu.setSizeMax(1*1024*1024); // 设置允许用户上传文件大小,单位:字节 73 fu.setSizeThreshold(4096); // 设置最多只允许在内存中存储的数据,单位:字节 74 fu.setRepositoryPath(temp); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 75 76 //开始读取上传信息 77 int index=0; 78 List fileItems = null; 79 try { 80 fileItems = fu.parseRequest(request); 81 System.out.println("fileItems="+fileItems); 82 } catch (Exception e) { 83 e.printStackTrace(); 84 } 85 86 // 依次处理每个上传的文件 87 Iterator iter = fileItems.iterator(); 88 while (iter.hasNext()) 89 { 90 FileItem item = (FileItem)iter.next();// 忽略其他不是文件域的所有表单信息 91 if (!item.isFormField()) 92 { 93 String img = item.getName();//获取上传文件名,包括路径 94 img=img.substring(img.lastIndexOf("\\")+1);//从全路径中提取文件名 95 long size = item.getSize(); 96 if((img==null||img.equals("")) && size==0){ 97 continue; 98 } 99 // int point = img.indexOf("."); 100 // img=(new Date()).getTime()+index+img.substring(point,img.length()); 101 // index++; 102 File fNew= new File(loadpath, img); 103 try { 104 item.write(fNew); 105 } catch (Exception e) { 106 // TODO Auto-generated catch block 107 e.printStackTrace(); 108 } 109 /*int len=img.length(); 110 int length=len-11; 111 String userName=img.substring(0,length); 112 boolean b=UsersDao.updateUsersImg(userName, img); 113 out.println(b);*/ 114 115 }else{ 116 //取出不是文件域的所有表单信息 117 String fieldvalue = item.getString(); 118 //如果包含中文应写为:(转为UTF-8编码) 119 //String fieldvalue = new String(item.getString().getBytes(),"UTF-8"); 120 } 121 } 122 //response.getOutputStream().print(true); 123 out.println(true); 124 //out.flush(); 125 //out.close(); 126 } 127 128 /** 129 * Initialization of the servlet. <br> 130 * 131 * @throws ServletException if an error occurs 132 */ 133 public void init() throws ServletException { 134 // Put your code here 135 } 136 137 }
上传头像图片的activity:PersonnalMessageActivity
1 package com.ghp.guodouRecipe; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 import com.android.volley.Request.Method; 9 import com.android.volley.RequestQueue; 10 import com.android.volley.Response.ErrorListener; 11 import com.android.volley.Response.Listener; 12 import com.android.volley.VolleyError; 13 import com.android.volley.toolbox.ImageLoader; 14 import com.android.volley.toolbox.Volley; 15 import com.ghp.entity.Users; 16 import com.ghp.tools.CustomRequest; 17 import com.ghp.tools.GuodouRecipeApplication; 18 import com.ghp.tools.ToRoundBitmap; 19 import com.ghp.tools.UploadUtil; 20 import com.google.gson.Gson; 21 22 import android.annotation.SuppressLint; 23 import android.app.Activity; 24 import android.app.AlertDialog; 25 import android.content.DialogInterface; 26 import android.content.Intent; 27 import android.graphics.Bitmap; 28 import android.graphics.BitmapFactory; 29 import android.graphics.drawable.BitmapDrawable; 30 import android.graphics.drawable.Drawable; 31 import android.net.Uri; 32 import android.os.Bundle; 33 import android.os.Environment; 34 import android.os.Handler; 35 import android.os.Message; 36 import android.os.StrictMode; 37 import android.provider.MediaStore; 38 import android.view.Menu; 39 import android.view.MenuItem; 40 import android.view.View; 41 import android.view.View.OnClickListener; 42 import android.view.Window; 43 import android.widget.EditText; 44 import android.widget.ImageView; 45 import android.widget.TextView; 46 import android.widget.Toast; 47 48 public class PersonnalMessageActivity extends Activity implements OnClickListener { 49 private String userName; 50 private String selecteSex; 51 /**头像*/ 52 ImageView header_portrait_personnal_img; 53 /**头像Bitmap*/ 54 private Bitmap headerPortait; 55 private static String path="/sdcard/guodouRecipe/myHeader/";//sd路径 56 private String[] items = new String[] { "选择本地图片", "拍照" }; 57 private String picPath = null; 58 private RequestQueue requestQueue=null; 59 private ImageLoader mImageLoader; 60 61 TextView user_name_personnal_text; 62 TextView user_tag_personnal_text; 63 TextView user_sex_personnal_text; 64 TextView user_area_personnal_text; 65 66 ImageView go_back_fisrt; 67 @SuppressLint("NewApi") 68 @Override 69 protected void onCreate(Bundle savedInstanceState) { 70 this.requestWindowFeature(Window.FEATURE_NO_TITLE); 71 super.onCreate(savedInstanceState); 72 setContentView(R.layout.activity_personnal_message); 73 Intent intent=getIntent(); 74 userName=intent.getStringExtra("userName"); 75 76 //*****头像的处理***** 77 requestQueue=Volley.newRequestQueue(PersonnalMessageActivity.this); 78 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); 79 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); 80 81 initView(); 82 //********** 83 84 85 86 String url="http://172.27.211.1/guodouRecipe/servlet/find_user_message_servlet"; 87 CustomRequest request=new CustomRequest(Method.POST, url, new Listener<String>() { 88 89 @Override 90 public void onResponse(String result) { 91 // TODO Auto-generated method stub 92 Gson gson=new Gson(); 93 Users u=gson.fromJson(result, Users.class); 94 user_name_personnal_text.setHint(userName); 95 user_tag_personnal_text.setText(u.getUserPersonnalTag()); 96 user_sex_personnal_text.setText(u.getUserSex()); 97 } 98 }, new ErrorListener(){ 99 100 @Override 101 public void onErrorResponse(VolleyError arg0) { 102 // TODO Auto-generated method stub 103 104 } 105 106 }); 107 request.setParam("userName", userName); 108 109 GuodouRecipeApplication app=(GuodouRecipeApplication)PersonnalMessageActivity.this.getApplication(); 110 app.getmRequestQueue().add(request); 111 } 112 113 private void initView() { 114 header_portrait_personnal_img=(ImageView) findViewById(R.id.header_portrait_personnal_img); 115 header_portrait_personnal_img.setOnClickListener(listener); 116 117 //*******头像处理******* 118 Bitmap bt = BitmapFactory.decodeFile(path + "/"+userName+"_header.jpg");//从Sd中找头像,转换成Bitmap 119 if(bt!=null){ 120 @SuppressWarnings("deprecation") 121 Drawable drawable = new BitmapDrawable(bt);//转换成drawable 122 //圆形 123 header_portrait_personnal_img.setImageBitmap(ToRoundBitmap.toRoundBitmap(bt)); 124 //方形 125 //header_portrait_personnal_img.setImageDrawable(drawable); 126 }else{ 127 /** 128 * 如果SD里面没有则需要从服务器取头像,取回来的头像再保存在SD中 129 * 130 */ 131 mImageLoader = getImageLoader(); 132 String url="http://172.27.211.1/guodouRecipe/headerportaitimages/"; 133 String userImg=userName+"_header.jpg"; 134 mImageLoader.get(url+userImg, mImageLoader.getImageListener(header_portrait_personnal_img, 0, 0)); 135 Bitmap bm=header_portrait_personnal_img.getDrawingCache(); 136 header_portrait_personnal_img.setImageBitmap(ToRoundBitmap.toRoundBitmap(bm)); 137 } 138 //**************************** 139 140 user_name_personnal_text=(TextView) findViewById(R.id.user_name_personnal_text); 141 //user_name_personnal_text.setOnClickListener(this); 142 user_tag_personnal_text=(TextView) findViewById(R.id.user_tag_personnal_text); 143 user_tag_personnal_text.setOnClickListener(this); 144 user_sex_personnal_text=(TextView) findViewById(R.id.user_sex_personnal_text); 145 user_sex_personnal_text.setOnClickListener(this); 146 user_area_personnal_text=(TextView) findViewById(R.id.user_area_personnal_text); 147 user_area_personnal_text.setOnClickListener(this); 148 149 go_back_fisrt=(ImageView) findViewById(R.id.go_back_fisrt); 150 go_back_fisrt.setOnClickListener(this); 151 } 152 153 //*******头像处理******* 154 private View.OnClickListener listener = new View.OnClickListener(){ 155 156 @Override 157 public void onClick(View v) { 158 // TODO Auto-generated method stub 159 showDialog(); 160 }}; 161 /** 162 * 显示选择对话框 163 */ 164 private void showDialog() { 165 166 new AlertDialog.Builder(this) 167 .setTitle("设置头像") 168 .setItems(items, new DialogInterface.OnClickListener() { 169 170 @Override 171 public void onClick(DialogInterface dialog, int which) { 172 switch (which) { 173 case 0: 174 Intent intent1 = new Intent(Intent.ACTION_PICK, null); 175 intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); 176 startActivityForResult(intent1, 11); 177 break; 178 case 1: 179 180 Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 181 intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), 182 "/"+userName+"_header.jpg"))); 183 startActivityForResult(intent2, 22);//采用ForResult打开 184 break; 185 } 186 } 187 }) 188 .setNegativeButton("取消", new DialogInterface.OnClickListener() { 189 190 @Override 191 public void onClick(DialogInterface dialog, int which) { 192 dialog.dismiss(); 193 } 194 }).show(); 195 } 196 197 /** 198 * 调用系统的裁剪 199 * @param uri 200 */ 201 public void cropPhoto(Uri uri) { 202 Intent intent = new Intent("com.android.camera.action.CROP"); 203 intent.setDataAndType(uri, "image/*"); 204 intent.putExtra("crop", "true"); 205 // aspectX aspectY 是宽高的比例 206 intent.putExtra("aspectX", 1); 207 intent.putExtra("aspectY", 1); 208 // outputX outputY 是裁剪图片宽高 209 intent.putExtra("outputX", 150); 210 intent.putExtra("outputY", 150); 211 intent.putExtra("return-data", true); 212 startActivityForResult(intent, 33); 213 } 214 /**头像保存到sd*/ 215 private void setPicToView(Bitmap mBitmap) { 216 String sdStatus = Environment.getExternalStorageState(); 217 if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 218 return; 219 } 220 FileOutputStream b = null; 221 File file = new File(path); 222 file.mkdirs();// 创建文件夹 223 String fileName =path +userName+"_header.jpg";//图片名字 224 try { 225 picPath = fileName; 226 b = new FileOutputStream(fileName); 227 mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件 228 229 } catch (FileNotFoundException e) { 230 e.printStackTrace(); 231 } finally { 232 try { 233 //关闭流 234 b.flush(); 235 b.close(); 236 } catch (IOException e) { 237 e.printStackTrace(); 238 } 239 240 } 241 } 242 243 @Override 244 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 245 switch (requestCode) { 246 case 11: 247 if (resultCode == RESULT_OK) { 248 cropPhoto(data.getData());//裁剪图片 249 } 250 251 break; 252 case 22: 253 if (resultCode == RESULT_OK) { 254 File temp = new File(Environment.getExternalStorageDirectory() 255 + "/"+userName+"_header.jpg"); 256 cropPhoto(Uri.fromFile(temp));//裁剪图片 257 } 258 259 break; 260 case 33: 261 if (data != null) { 262 Bundle extras = data.getExtras(); 263 headerPortait = extras.getParcelable("data"); 264 if(headerPortait!=null){ 265 setPicToView(headerPortait);//保存在SD卡中 266 File file = new File(picPath); 267 String request = UploadUtil.uploadFile( file, "http://172.27.211.1/guodouRecipe/servlet/headerPortaitUploadServlet"); 268 if (request!=null&&!request.equals("")) { 269 Toast.makeText(getApplicationContext(), "头像修改成功", 0).show(); 270 } 271 header_portrait_personnal_img.setImageBitmap(ToRoundBitmap.toRoundBitmap(headerPortait));//用ImageView显示出来 272 } 273 } 274 break; 275 default: 276 break; 277 278 } 279 super.onActivityResult(requestCode, resultCode, data); 280 }; 281 //********************************** 282 @Override 283 public void onClick(View v) { 284 // TODO Auto-generated method stub 285 switch (v.getId()) { 286 case R.id.user_tag_personnal_text: 287 //个性标签处理 288 final EditText et=new EditText(PersonnalMessageActivity.this); 289 new AlertDialog.Builder(PersonnalMessageActivity.this) 290 .setTitle("编辑个性标签") 291 .setView(et) 292 .setPositiveButton("确定", 293 new DialogInterface.OnClickListener() { 294 295 @Override 296 public void onClick(DialogInterface dialog, int which) { 297 final String changeUserPersonnalTag=et.getText().toString(); 298 //if (changeUserPersonnalTag!=null&&!changeUserPersonnalTag.equals("")) { 299 String url="http://172.27.211.1/guodouRecipe/servlet/changeUserPersonnalTagServlet"; 300 CustomRequest postRequest=new CustomRequest(Method.POST, url, new Listener<String>() { 301 302 @Override 303 public void onResponse(String ret) { 304 if(ret.equals("true")){ 305 if(changeUserPersonnalTag!=null&&!changeUserPersonnalTag.equals("")){ 306 user_tag_personnal_text.setText(et.getText().toString()); 307 myHandler.sendEmptyMessage(0); 308 }else{ 309 user_tag_personnal_text.setHint("未填写"); 310 Toast.makeText(getApplicationContext(), "没有编辑", 0).show(); 311 } 312 } 313 314 } 315 }, new ErrorListener(){ 316 317 @Override 318 public void onErrorResponse(VolleyError arg0) { 319 // TODO Auto-generated method stub 320 myHandler.sendEmptyMessage(1); 321 }}); 322 postRequest.setParam("userName", userName); 323 postRequest.setParam("changeUserPersonnalTag", changeUserPersonnalTag); 324 requestQueue.add(postRequest); 325 326 //} else { 327 // Toast.makeText(getApplicationContext(), "没有编辑", 0).show(); 328 //} 329 } 330 }) 331 .setNegativeButton("取消",new DialogInterface.OnClickListener() { 332 333 @Override 334 public void onClick(DialogInterface arg0, int arg1) { 335 Toast.makeText(getApplicationContext(), "已放弃编辑", 0).show(); 336 } 337 }) 338 .setCancelable(false) 339 .show(); 340 341 break; 342 case R.id.user_sex_personnal_text: 343 final String[] sexs={"男","女"}; 344 selecteSex=sexs[0]; 345 new AlertDialog.Builder(PersonnalMessageActivity.this) 346 .setTitle("请选择性别") 347 .setSingleChoiceItems(sexs, 0, 348 new DialogInterface.OnClickListener() { 349 350 @Override 351 public void onClick(DialogInterface dialog, int which) { 352 // TODO Auto-generated method stub 353 selecteSex=sexs[which]; 354 } 355 }) 356 .setPositiveButton("确定", 357 new DialogInterface.OnClickListener() { 358 359 @Override 360 public void onClick(DialogInterface dialog, int which) { 361 // TODO Auto-generated method stub 362 Toast.makeText(PersonnalMessageActivity.this, selecteSex, Toast.LENGTH_SHORT).show(); 363 String url="http://172.27.211.1/guodouRecipe/servlet/changeUserSexServlet"; 364 CustomRequest postRequest=new CustomRequest(Method.POST, url, new Listener<String>() { 365 366 @Override 367 public void onResponse(String ret) { 368 if(ret.equals("true")){ 369 user_sex_personnal_text.setText(selecteSex); 370 //myHandler.sendEmptyMessage(0); 371 372 } 373 } 374 }, new ErrorListener(){ 375 376 @Override 377 public void onErrorResponse(VolleyError arg0) { 378 // TODO Auto-generated method stub 379 myHandler.sendEmptyMessage(1); 380 }}); 381 postRequest.setParam("userName", userName); 382 postRequest.setParam("selecteSex", selecteSex); 383 requestQueue.add(postRequest); 384 } 385 }) 386 .setNegativeButton("取消", null) 387 .show(); 388 break; 389 case R.id.go_back_fisrt: 390 Intent intent=new Intent(PersonnalMessageActivity.this,PersonalGuodouActivity.class); 391 intent.putExtra("userName", userName); 392 setResult(5,intent); 393 finish(); 394 overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 395 396 break; 397 case R.id.user_area_personnal_text: 398 Toast.makeText(getApplicationContext(), "还没有开放本功能", Toast.LENGTH_SHORT).show(); 399 break; 400 default: 401 break; 402 } 403 } 404 Handler myHandler=new Handler(){ 405 406 @Override 407 public void handleMessage(Message msg) { 408 super.handleMessage(msg); 409 switch (msg.what) { 410 case 0: 411 Toast.makeText(getApplicationContext(), "编辑成功", 0).show(); 412 break; 413 case 1: 414 Toast.makeText(getApplicationContext(), "请求失败了", 0).show(); 415 break; 416 default: 417 break; 418 } 419 } 420 421 }; 422 public ImageLoader getImageLoader(){ 423 GuodouRecipeApplication tna=(GuodouRecipeApplication) getApplication(); 424 return tna.getmImageLoader(); 425 } 426 }
activity的布局文件:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 tools:context="${relativePackage}.${activityClass}" > 6 7 <RelativeLayout 8 android:id="@+id/personal_message_header" 9 android:layout_width="match_parent" 10 android:layout_height="50dp" 11 android:background="#efe7d7" > 12 13 <ImageView 14 android:id="@+id/go_back_fisrt" 15 android:layout_width="wrap_content" 16 android:layout_height="fill_parent" 17 android:layout_alignParentLeft="true" 18 android:adjustViewBounds="true" 19 android:gravity="center_vertical" 20 android:src="@drawable/goback_activity" /> 21 22 <ImageView 23 android:id="@+id/header_logo" 24 android:layout_width="wrap_content" 25 android:layout_height="fill_parent" 26 android:layout_gravity="center_vertical" 27 android:layout_marginRight="5dp" 28 android:layout_toRightOf="@+id/go_back_fisrt" 29 android:adjustViewBounds="true" 30 android:src="@drawable/ic_main_logo" /> 31 32 <TextView 33 android:id="@+id/personal_user_name" 34 android:layout_width="wrap_content" 35 android:layout_height="fill_parent" 36 android:layout_toRightOf="@+id/header_logo" 37 android:gravity="center_vertical" 38 android:textSize="18sp" 39 android:textStyle="bold" 40 android:text="个人资料" /> 41 42 </RelativeLayout> 43 <RelativeLayout 44 android:id="@+id/personal_message_canter" 45 android:layout_width="match_parent" 46 android:layout_height="wrap_content" 47 android:layout_below="@+id/personal_message_header" 48 android:layout_marginLeft="15dp" 49 android:layout_marginRight="15dp" 50 android:layout_marginTop="10dp" 51 android:layout_marginBottom="5dp"> 52 <TextView 53 android:id="@+id/header_portrait_personnal" 54 android:layout_width="120dp" 55 android:layout_height="30dp" 56 android:textSize="16sp" 57 android:layout_marginTop="8dp" 58 android:layout_marginBottom="8dp" 59 android:gravity="center_vertical" 60 android:text="头像" /> 61 <ImageView 62 android:id="@+id/header_portrait_personnal_img" 63 android:layout_width="30dp" 64 android:layout_height="30dp" 65 android:layout_marginTop="8dp" 66 android:layout_toRightOf="@+id/header_portrait_personnal" 67 android:background="@drawable/default_user_photo"/> 68 <ImageView 69 android:id="@+id/line1" 70 android:layout_below="@+id/header_portrait_personnal" 71 style="@style/left_drawer_item_line" /> 72 <TextView 73 android:id="@+id/user_name_personnal" 74 android:layout_width="120dp" 75 android:layout_height="30dp" 76 android:layout_below="@+id/line1" 77 android:textSize="16sp" 78 android:layout_marginTop="8dp" 79 android:layout_marginBottom="8dp" 80 android:gravity="center_vertical" 81 android:text="昵称" /> 82 <TextView 83 android:id="@+id/user_name_personnal_text" 84 android:layout_width="wrap_content" 85 android:layout_height="30dp" 86 android:layout_below="@+id/line1" 87 android:layout_marginTop="8dp" 88 android:layout_toRightOf="@+id/header_portrait_personnal" 89 android:textSize="16sp" 90 android:gravity="center_vertical" 91 android:hint="昵称"/> 92 <ImageView 93 android:id="@+id/line2" 94 android:layout_below="@+id/user_name_personnal" 95 style="@style/left_drawer_item_line" /> 96 97 <TextView 98 android:id="@+id/user_tag_personnal" 99 android:layout_width="120dp" 100 android:layout_height="30dp" 101 android:layout_below="@+id/line2" 102 android:textSize="16sp" 103 android:layout_marginTop="8dp" 104 android:layout_marginBottom="8dp" 105 android:gravity="center_vertical" 106 android:text="个性化标签" /> 107 <TextView 108 android:id="@+id/user_tag_personnal_text" 109 android:layout_width="wrap_content" 110 android:layout_height="30dp" 111 android:layout_below="@+id/line2" 112 android:layout_marginTop="8dp" 113 android:layout_toRightOf="@+id/user_tag_personnal" 114 android:textSize="16sp" 115 android:gravity="center_vertical" 116 android:hint="未填写"/> 117 <ImageView 118 android:id="@+id/line3" 119 android:layout_below="@+id/user_tag_personnal" 120 style="@style/left_drawer_item_line" /> 121 122 <TextView 123 android:id="@+id/user_sex_personnal" 124 android:layout_width="120dp" 125 android:layout_height="30dp" 126 android:layout_below="@+id/line3" 127 android:textSize="16sp" 128 android:layout_marginTop="8dp" 129 android:layout_marginBottom="8dp" 130 android:gravity="center_vertical" 131 android:text="性别" /> 132 <TextView 133 android:id="@+id/user_sex_personnal_text" 134 android:layout_width="wrap_content" 135 android:layout_height="30dp" 136 android:layout_below="@+id/line3" 137 android:layout_marginTop="8dp" 138 android:layout_toRightOf="@+id/user_sex_personnal" 139 android:textSize="16sp" 140 android:gravity="center_vertical" 141 android:hint="未选择"/> 142 <ImageView 143 android:id="@+id/line4" 144 android:layout_below="@+id/user_sex_personnal" 145 style="@style/left_drawer_item_line" /> 146 147 <TextView 148 android:id="@+id/user_area_personnal" 149 android:layout_width="120dp" 150 android:layout_height="30dp" 151 android:layout_below="@+id/line4" 152 android:textSize="16sp" 153 android:layout_marginTop="8dp" 154 android:layout_marginBottom="8dp" 155 android:gravity="center_vertical" 156 android:text="地区" /> 157 <TextView 158 android:id="@+id/user_area_personnal_text" 159 android:layout_width="wrap_content" 160 android:layout_height="30dp" 161 android:layout_below="@+id/line4" 162 android:layout_marginTop="8dp" 163 android:layout_toRightOf="@+id/user_area_personnal" 164 android:textSize="16sp" 165 android:gravity="center_vertical" 166 android:hint="请选择所在地区"/> 167 <ImageView 168 android:id="@+id/line5" 169 android:layout_below="@+id/user_area_personnal" 170 style="@style/left_drawer_item_line" /> 171 </RelativeLayout> 172 </RelativeLayout>
完整代码供大家参考,希望有用,中间有用到方形图片转换成圆形,方法在我的另一篇博文里
时间: 2024-10-12 09:17:42