自制通讯录
来源:互联网 发布:linux下修改字符集 编辑:程序博客网 时间:2024/04/25 11:35
这次的通讯录主要包括手机联系人列表展现,新建联系人两个功能。大概结构如下:
首先上联系人列表xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#fcfcfc" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="45dp" android:id="@+id/title" android:background="#3370CC" android:gravity="center_vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="联系人" android:layout_centerInParent="true" android:textSize="20sp"android:textColor="#ffffff" /> <ImageButton android:id="@+id/right_btn" android:layout_width="100px" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="5dp" android:src="@drawable/title_btn_function"android:background="@drawable/xj"android:onClick="newPer" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:background="@drawable/search_bar_bg" > <EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="搜索" android:singleLine="true" android:focusable="false" android:focusableInTouchMode="true" android:textColor="#000" android:drawableLeft="@drawable/search_bar_icon_normal" android:background="@drawable/search_bar_edit_bg" > </EditText> </LinearLayout> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginRight="22dp" android:id="@+id/ListView01"> </ListView> <com.example.shabao.SideBar android:id = "@+id/sideBar" android:layout_height="fill_parent" android:layout_width="22dp" android:layout_alignParentRight="true" /> </RelativeLayout> </LinearLayout>再来看MainActivity:
import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.TreeMap;import android.os.Bundle;import android.annotation.SuppressLint;import android.app.Activity;import android.content.ContentResolver;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.Window;import android.widget.ListView;import android.widget.SimpleAdapter;/** * * @author 百世经纶 * */@SuppressLint("DefaultLocale")public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.contact_list); ListView list = (ListView) findViewById(R.id.ListView01); //生成动态数组,加入数据 ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>(); //用TreeMap可以实现按首字母排序,不需要另外再做排序操作 Map<String,ArrayList<ContactInfo>> maplist = new TreeMap<String,ArrayList<ContactInfo>>(); ContentResolver resolver = this.getContentResolver(); maplist = Util.getContact(resolver); ArrayList<ContactInfo> value = new ArrayList<ContactInfo>(); Iterator<String> it=maplist.keySet().iterator(); String key = ""; while(it.hasNext()){ key = it.next().toString(); value = maplist.get(key); listItem.add(Util.addC(key)); for(ContactInfo c :value){ listItem.add(Util.addC(c)); } } //生成适配器的Item和动态数组对应的元素 MyListAdapter listItemAdapter = new MyListAdapter(this,listItem,//数据源 R.layout.childlayout,//ListItem的XML实现 //动态数组与ImageItem对应的子项 new String[] {"ItemImage","ItemTitle", "ItemText", "key"}, //ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] {R.id.contactIcon,R.id.name,R.id.description} ); //添加并且显示 list.setAdapter(listItemAdapter); SideBar indexBar = (SideBar) findViewById(R.id.sideBar); indexBar.setListView(list); }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void newPer(View v){Intent intent = new Intent(MainActivity.this, Contact_CreatActivity.class);startActivity(intent);MainActivity.this.finish();}}里面用到的取通讯录数据的方法在Util文件中,我在里面建了27个线性列表不知道是不是还有更简便的写法,
import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import java.util.TreeMap;import android.content.ContentResolver;import android.database.Cursor;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.text.TextUtils;/** * * @author 百世经纶 * */public class Util {//还原11位手机号public static String GetNumber(String num){if(num!=null){if (num.startsWith("+86")) {num = num.substring(3); } else if (num.startsWith("86")){ num = num.substring(2); }}else{num="";}return num;}/** * 读取手机上的联系人 * @param r * @return */public static Map<String,ArrayList<ContactInfo>> getContact(ContentResolver r) { Map<String,ArrayList<ContactInfo>> listMembers = new TreeMap<String,ArrayList<ContactInfo>>(); ArrayList<ContactInfo> ma = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mb = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mc = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> md = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> me = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mf = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mg = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mh = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mi = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mj = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mk = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> ml = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mm = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mn = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mo = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mp = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mq = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mr = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> ms = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mt = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mu = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mv = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mw = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mx = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> my = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> mz = new ArrayList<ContactInfo>(); ArrayList<ContactInfo> other = new ArrayList<ContactInfo>(); Cursor cursor = null; try { // ContentResolver resolver = this.getContentResolver(); cursor= r.query(Phone.CONTENT_URI, new String[] { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER, Phone.SORT_KEY_PRIMARY }, null, null, Phone.SORT_KEY_PRIMARY); if (cursor != null) { while (cursor.moveToNext()) { ContactInfo contact = new ContactInfo(); String number = cursor.getString(2); // 当手机号码为空的或者为空字段 跳过当前循环 if (TextUtils.isEmpty(number)) continue; // 得到联系人名称 String username = cursor.getString(1); String sortKey = getSortKey(cursor.getString(3)); int id = cursor.getInt(0); contact.setContactName(username); contact.setSortKey(sortKey); contact.setUserNumber(number); contact.setId(id); if(sortKey.equals("A")){ ma.add(contact); }else if(sortKey.equals("B")){ mb.add(contact); }else if(sortKey.equals("C")){ mc.add(contact); }else if(sortKey.equals("D")){ md.add(contact); }else if(sortKey.equals("E")){ me.add(contact); }else if(sortKey.equals("F")){ mf.add(contact); }else if(sortKey.equals("G")){ mg.add(contact); }else if(sortKey.equals("H")){ mh.add(contact); }else if(sortKey.equals("I")){ mi.add(contact); }else if(sortKey.equals("J")){ mj.add(contact); }else if(sortKey.equals("K")){ mk.add(contact); }else if(sortKey.equals("L")){ ml.add(contact); }else if(sortKey.equals("M")){ mm.add(contact); }else if(sortKey.equals("N")){ mn.add(contact); }else if(sortKey.equals("O")){ mo.add(contact); }else if(sortKey.equals("P")){ mp.add(contact); }else if(sortKey.equals("Q")){ mq.add(contact); }else if(sortKey.equals("R")){ mr.add(contact); }else if(sortKey.equals("S")){ ms.add(contact); }else if(sortKey.equals("T")){ mt.add(contact); }else if(sortKey.equals("U")){ mu.add(contact); }else if(sortKey.equals("V")){ mv.add(contact); }else if(sortKey.equals("W")){ mw.add(contact); }else if(sortKey.equals("X")){ mx.add(contact); }else if(sortKey.equals("Y")){ my.add(contact); }else if(sortKey.equals("Z")){ mz.add(contact); }else if(sortKey.equals("#")){ other.add(contact); } } listMembers.put("A", ma); listMembers.put("B", mb); listMembers.put("C", mc); listMembers.put("D", md); listMembers.put("E", me); listMembers.put("F", mf); listMembers.put("G", mg); listMembers.put("H", mh); listMembers.put("I", mi); listMembers.put("J", mj); listMembers.put("K", mk); listMembers.put("L", ml); listMembers.put("M", mm); listMembers.put("N", mn); listMembers.put("O", mo); listMembers.put("P", mp); listMembers.put("Q", mq); listMembers.put("R", mr); listMembers.put("S", ms); listMembers.put("T", mt); listMembers.put("U", mu); listMembers.put("V", mv); listMembers.put("W", mw); listMembers.put("X", mx); listMembers.put("Y", my); listMembers.put("Z", mz); listMembers.put("#", other); } }catch(Exception e){ e.printStackTrace(); }finally{ cursor = null; }return listMembers;}/*** 获取sort key的首个字符,如果是英文字母就直接返回,否则返回#。* * @param sortKeyString* 数据库中读取出的sort key* @return 英文字母或者#*/private static String getSortKey(String sortKeyString) {String key = sortKeyString.substring(0, 1).toUpperCase();if (key.matches("[A-Z]")) { return key;}return "#";} public static HashMap<String, Object> addC(ContactInfo c){HashMap<String, Object> map = new HashMap<String, Object>();map.put("ItemImage", R.drawable.h015);//图像资源的ID map.put("ItemTitle", c.getContactName()); map.put("ItemText", c.getUserNumber()); map.put("key", c.getSortKey());return map;}public static HashMap<String, Object> addC(String key){HashMap<String, Object> map = new HashMap<String, Object>();map.put("ItemImage", null);//图像资源的ID map.put("ItemTitle", key); map.put("ItemText", null); map.put("key", key);return map;}}接下去是 适配器和索引,索引这一块,之前还不知道怎么处理,参考了下面这篇博客才完成的:http://blog.csdn.net/ilysony/article/details/6292771。
import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import android.content.Context;import android.graphics.Color;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.SectionIndexer;import android.widget.SimpleAdapter;import android.widget.TextView;public class MyListAdapter extends SimpleAdapter implements SectionIndexer {private View myView;private TextView name, num;private ImageView img;private LayoutInflater layoutinflater;ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();int layoutId;String[] from;int[] to;@SuppressWarnings("unchecked")public MyListAdapter(Context context, List<? extends Map<String, ?>> data,int resource, String[] from, int[] to) {super(context, data, resource, from, to);// TODO Auto-generated constructor stubthis.listItem = (ArrayList<HashMap<String, Object>>) data;this.layoutId = resource;this.from = from;this.to = to;this.layoutinflater = LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn super.getCount();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubmyView = layoutinflater.inflate(R.layout.childlayout, null);name = (TextView) myView.findViewById(to[1]);num = (TextView) myView.findViewById(to[2]);img = (ImageView) myView.findViewById(to[0]);//Iterator<HashMap<String, Object>> it1 = listItem.iterator();//while(it1.hasNext()){HashMap<String, Object> map = new HashMap<String, Object>();map = listItem.get(position);if(map.get(from[0]) == null && map.get(from[2]) == null){//英文首字母name.setText(map.get(from[1]).toString());num.setVisibility(View.GONE);img.setVisibility(View.GONE);name.setTextSize(26);name.setBackgroundColor(Color.GRAY);if(listItem.get(position+1).get(from[3]).toString().equals(map.get(from[1]).toString())){name.setVisibility(View.VISIBLE);}else{//字母目录下没有列表项LinearLayout l1 = (LinearLayout) myView.findViewById(R.id.linearLayout1);l1.setVisibility(View.GONE);}}else{//正常联系人name.setText(map.get(from[1]).toString());img.setImageResource((Integer) map.get(from[0]));num.setText(map.get(from[2]).toString());num.setVisibility(View.VISIBLE);img.setVisibility(View.VISIBLE);//l1.setVisibility(View.VISIBLE);name.setTextSize(30);}//}return myView;}@Overridepublic Object[] getSections() {// TODO Auto-generated method stubreturn null;}@Overridepublic int getPositionForSection(int section) {// TODO Auto-generated method stubif (section == 35) { return 0; } for (int i = 0; i < listItem.size(); i++) { char[] firstChar = listItem.get(i).get(from[3]).toString().toCharArray(); if (firstChar[0] == section) { return i; } } return -1; }@Overridepublic int getSectionForPosition(int position) {// TODO Auto-generated method stubreturn 0;}}索引类:
import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.ListView;import android.widget.SectionIndexer;/** * * @author 百世经纶 * */public class SideBar extends View {private char[] l;private SectionIndexer sectionIndexter = null;private ListView list;private final int m_nItemHeight = 38;private int aa = 0;public SideBar(Context context) {super(context);init();}public SideBar(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {l = new char[] {'#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S','T', 'U', 'V', 'W', 'X', 'Y', 'Z' };setBackgroundColor(0x44FFFFFF);}public SideBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public void setListView(ListView _list) {list = _list;sectionIndexter = (SectionIndexer) _list.getAdapter();}public boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);int i = (int) event.getY();int idx = i / m_nItemHeight;if (idx >= l.length) {idx = l.length - 1;} else if (idx < 0) {idx = 0;}//取得当前按下的数组下标aa = idx;invalidate();//重新绘制界面if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {if (sectionIndexter == null) {sectionIndexter = (SectionIndexer) list.getAdapter();}//获取列表的位置int position = sectionIndexter.getPositionForSection(l[idx]);if (position == -1) {return true;}//将列表焦点移到当前位置list.setSelection(position);}return true;}protected void onDraw(Canvas canvas) {Paint paint = new Paint();paint.setColor(0xFFA6A9AA);paint.setTextSize(30);paint.setTextAlign(Paint.Align.CENTER);float widthCenter = getMeasuredWidth() / 2;for (int i = 0; i < l.length; i++) {if(i == aa){//绘制索引,按下的颜色加以区别paint.setColor(Color.GREEN);canvas.drawText(String.valueOf(l[i]), widthCenter, m_nItemHeight + (i * m_nItemHeight), paint);}else{paint.setColor(0xFFA6A9AA);canvas.drawText(String.valueOf(l[i]), widthCenter, m_nItemHeight + (i * m_nItemHeight), paint);}}super.onDraw(canvas);}}里面有用到的列表项xml:
<?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="wrap_content" android:orientation="horizontal" android:paddingTop="0.0dip" android:paddingBottom="0.0dip"> <ImageView android:id="@+id/contactIcon" android:padding="4.0dip" android:layout_width="48.0dip"android:layout_height="48.0dip"android:scaleType="fitCenter" android:layout_marginLeft="10.0dip"android:layout_marginTop="5.0dip"android:layout_marginBottom="5.0dip" android:src="@drawable/h015" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="fill_parent" android:layout_marginLeft="5.0dip"android:layout_marginTop="9.0dip"android:layout_marginBottom="9.0dip" android:orientation="vertical"> <TextView android:textColor="#000000" android:textSize="22sp" android:id="@+id/name" android:layout_marginRight="5.0dip" android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="true" android:text="name" /> <TextView android:id="@+id/description" android:textSize="18sp" android:textColor="#cccccc" android:text="13819881668" android:layout_marginTop="10dp" android:ellipsize="marquee" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginRight="5.0dip" android:singleLine="true" android:marqueeRepeatLimit="1" /> </LinearLayout> </LinearLayout>
最后是新建联系人页面,界面比较丑,凑合着看吧。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#fcfcfc" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="45dp" android:id="@+id/title" android:background="#3370CC" android:gravity="center_vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="新建联系人" android:layout_centerInParent="true" android:textSize="20sp"android:textColor="#ffffff" /> <TextView android:id="@+id/baocun" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:gravity="right" android:text="保存"android:onClick="newPer"android:textSize="20sp"android:textColor="#ffffff" /> </RelativeLayout> <LinearLayout android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginTop="5dip" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:text="姓名:" android:layout_gravity="center"/> <EditText android:id="@+id/sr_name" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:scrollHorizontally="true" android:autoText="false"/> </LinearLayout> <LinearLayout android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginTop="5dip" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:text="手机:" android:layout_gravity="center"/> <EditText android:id="@+id/sr_num" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:scrollHorizontally="true" android:autoText="false"/> </LinearLayout> </LinearLayout>相应的Activity:
import android.net.Uri;import android.os.Bundle;import android.provider.Contacts;import android.provider.Contacts.People;import android.app.Activity;import android.app.AlertDialog;import android.content.ContentValues;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.view.KeyEvent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.EditText;import android.widget.TextView;/** * * @author 百世经纶 * */@SuppressWarnings("deprecation")public class Contact_CreatActivity extends Activity {EditText name, num;TextView baocun;//OnClickListener l;@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.contact_create);name = (EditText) findViewById(R.id.sr_name);num = (EditText) findViewById(R.id.sr_num);baocun = (TextView) findViewById(R.id.baocun);baocun.setOnClickListener(l); }private OnClickListener l = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){case R.id.baocun:String uname = name.getText().toString(); String unum = num.getText().toString();if(uname != null && !uname.equals("") && unum !=null && !unum.equals("")){Uri u = insertContact(Contact_CreatActivity.this,uname,unum);System.out.println(u);new AlertDialog.Builder(Contact_CreatActivity.this).setTitle("提示").setMessage("新增联系人成功!").setPositiveButton("确定", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubname.setText("");num.setText("");}}).show();}else {new AlertDialog.Builder(Contact_CreatActivity.this).setTitle("提示").setMessage("新增联系人姓名、手机号码不能为空!").setPositiveButton("确定", null).show();}case R.id.delete:break;case R.id.newsome:break;default:break;}}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}/** * 插入联系人 */private Uri insertContact(Context context, String name, String phone) { ContentValues values = new ContentValues(); values.put(People.NAME, name); Uri uri = getContentResolver().insert(People.CONTENT_URI, values); Uri numberUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY); values.clear(); values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE); values.put(People.NUMBER, phone); getContentResolver().insert(numberUri, values); return uri;}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_BACK:if (event.getRepeatCount() == 0) { // 按下的如果是BACK,同时没有重复Intent intent = new Intent();intent.setClass(Contact_CreatActivity.this, MainActivity.class);startActivity(intent); Contact_CreatActivity.this.finish();}break;default:break;}return super.onKeyDown(keyCode, event);}}最后不要忘记加权限:
<uses-permission android:name="android.permission.WRITE_CONTACTS" /><uses-permission android:name="android.permission.READ_CONTACTS" />好了,看下运行的结果,以三星9300为准:
点一下索引,列表焦点下移
以上就是全部内容了,但还有一个问题:上拉左边的list,拉到其他索引位置的时候,怎么让索引的绿色光标跟着动。有兴趣的朋友可以交流一下。
0 0
- 自制通讯录
- 自制通讯录流程图
- 自制的简易通讯录
- 自制的通讯录APP(SQLite的应用)
- 自制
- Android中自制通讯录中显示出数据库中的姓名和电话号码进行打电话
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- 通讯录
- OpenGL: 混合
- 淘宝发货步骤
- research 和 debug
- zoj 3332 Strange Country II (dfs)
- cocos2d-x 3.0深入了解之五
- 自制通讯录
- 网易发布邮箱6.0版 整合移动社交App带来更多想象空间
- Google Map如么课程 04 做导航
- Android layout布局属性、标签属性总结大全
- iOS 数组 字典新写法
- MyEclipse
- 温故而知新之session生命周期详解
- 为什么vim的强制写不好用?
- Ubuntu下手动编译Tesseract-ocr