Android添加联系人信息并读取
效果图
题目
1. 创建一个File文件,路径为/mnt/sdcard/temp/zhiyuan.txt
2. 进入主页面后自动从File文件中读取联系人数据,每个item只显示,姓名和电话。如果,你在添加联系人时,填写了备注,那么item的姓名显示成你保存的备注。否则显示姓名。
3.  添加联系人功能,布局最上方有一个添加联系人按钮,下面是ListView, 当点击添加联系人按钮时,跳转至新页面,输入姓名,电话,备注(电话和 姓名不能为空,电话只能为数字)。确定后保存File文件,并且直接回退到 主页面
4. 当点击每个item时,跳转至详细页面,显示当前联系人的名字、电话、 备注。
代码演示
1.新建一个Module命名为AndroidContact
在XML布局文件activity_main中添加一个Button按钮命名为添加联系人信息
再添加一个ListView用于显示接收的联系人信息
2.新建一个activity_item行布局文件用于将联系人信息以行布局的形式显示在ListView列表上
并添加两个TextView用于显示联系人姓名和电话
3.新建一个AddActivity类用于跳转添加联系人信息
再新建一个DetialActivity类用于跳转显示联系人信息详情
4.在XML布局文件activity_add中添加三个EditText用于输入联系人姓名,电话,备注
再添加一个Button用于将输入的联系人信息保存到File文件中
5.在AddActivity中实例化EditText控件,Button控件,并给Button添加监听
在监听中实例化File对象,参数为路径名
判断文件是否存在,如果存在则存储数据并且追加数据属性
把文件 保存置为追加,true为追加
添加一个判断,如果联系人姓名,电话的内容不为空,则存储,备注信息可以为空
使用Toast提示存储是否成功
使用Finish();属性销毁页面返回主类
package com.example.cxy.androidcontact;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;public class AddActivity extends AppCompatActivity implements View.OnClickListener {private EditText ed_Name, ed_Phone, ed_Remark;private Button btn_Save;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add);initView();}private void initView() {ed_Name = (EditText) findViewById(R.id.editName);ed_Phone = (EditText) findViewById(R.id.editPhone);ed_Remark = (EditText) findViewById(R.id.editRemark);btn_Save = (Button) findViewById(R.id.btn_save);btn_Save.setOnClickListener(this);}@Override
    public void onClick(View v) {//判断文件是否存在,如果存在则存入数据,且为追加属性
        try {File file = new File("/mnt/sdcard/contact/contact.txt");if (!file.exists()) {file = new File("/mnt/sdcard/contact");file.mkdir();file = new File("/mnt/sdcard/contact/contact.txt");file.createNewFile();}//把你的文件保存置为追加。true则为追加
            FileOutputStream out = new FileOutputStream(file, true);//如果文本内容不为空,则存储
            if (!(TextUtils.isEmpty(ed_Name.getText().toString()) || TextUtils.isEmpty(ed_Phone.getText().toString()))) {String person = ed_Name.getText().toString() + "," + ed_Phone.getText().toString() + "," + ed_Remark.getText().toString() + "#";out.write(person.getBytes());out.close();Toast.makeText(AddActivity.this, "存储成功", Toast.LENGTH_SHORT).show();//页面销毁,返回主类
                finish();} else {Toast.makeText(AddActivity.this, "存储失败", Toast.LENGTH_SHORT).show();}} catch (IOException e) {e.printStackTrace();}}
}
6.新建一个Package包命名为adapter
在包中新建一个MyAdapter类用于给列表添加适配器
7.在MyAdapter类中编写一个私有的上下文对象(Context)和一个私有的List<Map<String,String>>mList;集合
构造一个List<Map<String,String>>mList;集合和Context上下文对象的有参构造方法
并使本类继承于BaseAdapter类(public class MyAdapter extends BaseAdapter)
将获取列表总长度的getCount()方法的返回值改为mList.size()返回全局的列表总长度
将获取当前整个Item的getItem()方法的返回值改为mList.get(position)返回一个当前视图中所有数据的下标
将获取当前Item的id的getItemId()方法的返回值改为position()返回Id的下标
将获取视图的getView()方法的返回值改为converView()返回当前视图给用户看
创建一个ViewHolder内部类对象用于声明activity_item行布局的TextView控件
创建ViewHodler类对象
添加判断当前converView是否为空如果为空则加载新的Item行布局
实例化ViewHodler并通过视图寻找控件Id
设置converView缓存标签,并传入控件
从converView视图中获取缓存标签
将对应下标的值赋给对应位置
添加判断如果联系人备注为空则显示电话,如果不为空则在电话位置显示备注
package com.example.cxy.androidcontact.adapter;import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import com.example.cxy.androidcontact.R;import java.util.List;
import java.util.Map;/**
 * Created by admin on 2017/3/5.
 */
public class MyAdapter extends BaseAdapter {private Context mContext;private List<Map<String, String>> mList;//有参构造方法
    public MyAdapter(Context context, List<Map<String, String>> list) {mContext = context;mList = list;}//获取列表总长度
    @Override
    public int getCount() {//返回一个全局的列表的总长度
        return mList.size();}//获取当前整个item(一整行)返回一个当前视图中的所有数据
    @Override
    public Object getItem(int position) {//返回下标
        return mList.get(position);}//获取当前itemID
    @Override
    public long getItemId(int position) {//返回下标
        return position;}//获取视图              当前视图下标     指当前视图           上级父容器
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {//创建一个ViewHodler类对象
        ViewHodler viewHodler;//判断当前converView是否为空,如果为空
        if (convertView == null) {//则加载新的item行布局
            convertView = LayoutInflater.from(mContext).inflate(R.layout.activity_item, null);//实例化viewHodler
            viewHodler = new ViewHodler();//通过视图寻找控件ID
            viewHodler.tvName = (TextView) convertView.findViewById(R.id.tv_Name);viewHodler.tvPhone = (TextView) convertView.findViewById(R.id.tv_Phone);//设置convertView缓存标签,传入控件
            convertView.setTag(viewHodler);} else {//convertView视图中获取缓存的标签
            viewHodler = (ViewHodler) convertView.getTag();}//将对应下标的值赋给对应位置
        viewHodler.tvName.setText(mList.get(position).get("name"));//如果联系人备注为空则显示电话,如果不为空则在电话位置显示备注
        if (TextUtils.isEmpty(mList.get(position).get("remark"))) {viewHodler.tvPhone.setText(mList.get(position).get("phone"));} else {viewHodler.tvPhone.setText(mList.get(position).get("remark"));}//返回当前converView视图给用户看
        return convertView;}//自定义内部类ViewHolder
    class ViewHodler {private TextView tvName, tvPhone;}
}
8.在主类MainActivity中创建私有的Button控件,ListView控件,List集合,Map集合
adapter适配器
使用initView方法初始化控件和List集合
在initView方法中实例化List数组,实例化Button按钮和ListView控件,并给Button按钮和ListView列表控件添加监听点击事件
在Button按钮的点击事件中添加跳转,跳转至AddActivity类
在ListView控件的点击事件中添加跳转,跳转至DetialActivity类,并将联系人信息传输到DetialActivity详情类
添加一个writeFile方法用于从File文件中读取数据
实例化File对象,参数为路径名
添加判断如果文件存在则读取,不存在则不读取
输出File文件中的内容
定义byte[]字节数组,使用available方法读取文件中存储的信息长度
调用read方法将bytes数组中的数据读取
关闭输出流
把文件中读取到的内容全部转化为字符串
先用#号将每个人分割
使用循环将单个联系人的三个属性分开
使用split分割将person数组中的信息用逗号分开
实例化Map集合
使用循环输出信息
存放集合
添加onResume方法使每次进入先清理集合,然后再次获取数据
并且如果适配器没有实例化,则实例化,否则则刷新
package com.example.cxy.androidcontact;import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;import com.example.cxy.androidcontact.adapter.MyAdapter;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {private Button btn_add;private ListView mListView;private List<Map<String, String>> mList;private Map<String, String> mMap;private MyAdapter adapter;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化控件和List集合的方法
        initview();}//从文件中读取数据的方法
    private void writeFile() {try {//实例化File对象,参数为路径名
            File file = new File("/mnt/sdcard/contact/contact.txt");//判断文件是否存在,存在则读取,不存在的不读取
            if (file.exists()) {//File文件输出
                FileInputStream input = new FileInputStream(file);//定义byte[]字节数组,使用available方法读取文件中存储的信息长度
                byte[] bytes = new byte[input.available()];//调用read方法将bytes数组中的数据读取
                input.read(bytes);//关闭输出流
                input.close();//把文件中读取到的内容全部转化为字符串
                String content = new String(bytes);//先以#号分割为每一个人
                String[] person = content.split("#");//使用循环把每一个人的三个属性分开
                for (int i = 0; i < person.length; i++) {//使用split分割将person数组中的信息用逗号分隔开
                    String[] split = person[i].split(",");mMap = new HashMap<>();//使用循环输出信息
                    for (int x = 0; x < split.length; x++) {if (x == 0) {mMap.put("name", split[x]);} else if (x == 1) {mMap.put("phone", split[x]);} else if (x == 2) {mMap.put("remark", split[x]);}}//存放集合
                    mList.add(mMap);}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private void initview() {mList = new ArrayList<>();btn_add = (Button) findViewById(R.id.btn_add);mListView = (ListView) findViewById(R.id.listView);btn_add.setOnClickListener(this);mListView.setOnItemClickListener(this);}@Override
    public void onClick(View v) {Intent intent = new Intent();intent.setClass(this, AddActivity.class);startActivity(intent);}@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent();intent.setClass(this, DetialActivity.class);//将联系人信息传到DetialActivity类中
        intent.putExtra("name", mList.get(position).get("name"));intent.putExtra("phone", mList.get(position).get("phone"));intent.putExtra("remark", mList.get(position).get("remark"));startActivity(intent);}//此方法,每次进入先清理集合,然后再次获取数据,
    //并且如果适配器没有实例化,则实例化,否则则刷新
    @Override
    protected void onResume() {super.onResume();mList.clear();writeFile();if (adapter != null) {adapter.notifyDataSetChanged();} else {adapter = new MyAdapter(this, mList);mListView.setAdapter(adapter);}}
}
9.在XML布局文件activity_detial中添加三个TextView用于展示联系人姓名,电话,备注
10.在DetialActivity类中实例化TextView
添加initView方法,初始化控件
在initView方法中实例化TextView控件
接收跳转
定义一个字符串接收MainActivity所传输的联系人姓名,电话,备注
将接收的联系人姓名,电话,备注显示在TextView中
package com.example.cxy.androidcontact;import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;public class DetialActivity extends AppCompatActivity {private TextView tv_Name, tv_Phone, tv_Remark;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_detial);initView();}private void initView() {tv_Name = (TextView) findViewById(R.id.tvName);tv_Phone = (TextView) findViewById(R.id.tvPhone);tv_Remark = (TextView) findViewById(R.id.tvRemark);Intent intent = getIntent();String name = intent.getStringExtra("name");String phone = intent.getStringExtra("phone");String remark = intent.getStringExtra("remark");tv_Name.setText(name);tv_Phone.setText(phone);tv_Remark.setText(remark);}
}

Android添加联系人信息并读取相关推荐

  1. android联系人添加公司,android添加联系人(直接添加到联系人数据库)

    添加联系人姓名.手机.头像... java核心代码 package com.kaka.addContact; import java.io.ByteArrayOutputStream; import  ...

  2. Android添加联系人到通讯录

    联系人名字 名字不知道为什么,值设置了之后传过去没有,于是自己通过 Intent 最后又单独传了一次 // 联系人名字 ContentValues row1 = new ContentValues() ...

  3. Android向通讯录添加联系人的一般方法

     Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: <uses-permission android:name="android.perm ...

  4. Android软件开发之通讯录——添加联系人以及SQLite工具的简单使用

    关于通讯录获取联系人信息以及联系人信息的存储结构,下面链接的博客的博主已经简单说明: http://blog.csdn.net/snwrking/article/detail/7601794 ---- ...

  5. 最快速读取手机通讯录中联系人信息

    作为一名Android开发,读写手机通讯录的操作人人都会,但是有没有遇到通讯录存在好几百条联系人信息时候读取的速度会明显变慢呢?本文就是介绍解决办法,我总结出了以下几种办法 提供参考: 一.线程 有A ...

  6. Windows Phone如何获取和添加联系人

    Windows Phone SDK 7.1 提供了获取联系人列表信息的API,虽然是只读的,但是相比SDK 7.0已经很不错了.联系信息获取的相关API位于Microsoft.Phone.UserDa ...

  7. Android中可通过二维码扫描,直接显示个人名片信息,而且可以点击添加,调用系统的添加联系人功能

    微信小程序出来后,出来了一个快速发名片的小程序,他会根据用户的信息生成一张二维码图片,用户扫描之后,就会读取二维码里面的数据,之后调用系统的名片展示界面,之后就可以添加联系人了.开始看到时,还挺好奇的 ...

  8. Android项目——读取手机联系人信息

    加入读取联系人信息的权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> cont ...

  9. android如何读取sim卡联系人信息,Android上如何获取手机和sim卡的联系人信息

    需求很明确,获取手机和sim的联系人信息.接口设计也很简介 public interface OnFetchContactsListener { void onFetcherContactsCompl ...

最新文章

  1. C++ 类的内存分布
  2. Anaconda3-5.3.0-Windows-x86_64
  3. .NET Core 单元测试
  4. jmu-枚举WeekDay
  5. yudian温控表a1温度怎么补偿_贴片电容怎么确定型号
  6. 计算机图形学——Bresenham画线算法
  7. eclipse工具性能优化方法
  8. 让 orangepi 用上Btsync(资源分享工具)好资源不怕和谐!
  9. 科学计算机度计算,科学计算器arctan
  10. python 计算均值 方差 标准差
  11. 下班后可以做点什么副业赚钱呢?
  12. 前端安全攻防大全--专注于攻击和防御
  13. 通信原理仿真100例 | 多普勒频移的matlab仿真
  14. SAP FICO 理解成本中心会计
  15. 白盒测试方法之逻辑覆盖
  16. K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停
  17. 生产力、商业价值和敏捷
  18. c语言按字母排序用直接插入法,直接插入排序(C语言实现)
  19. m6000查看端口状态_M6000日常查看维护命令 -
  20. IPv4向IPv6转换的几种技术分析(中科三方)

热门文章

  1. 第二章 DDR3实验
  2. js禁用tab键\Enter键
  3. CMake编译VS工程,生成解决方案时遇到错误:error MSB3073: 命令“setlocal”
  4. 九校联考-DL24 凉心模拟 Day1T3 三米诺 (tromino)
  5. linux下的arp刷新命令详解,linux arp 命令常用参数详解
  6. 搜苹果ipad版_苹果测试无刘海 iPhone / 三星 S10 指纹支付功能被关停 / 天外世界评分解禁...
  7. 前端单张图片下载,批量下载图片成压缩包
  8. 设置PreferenceFragment主题
  9. LeetCode 310. Minimum Height Trees
  10. STM32 SPI 的NSS引脚问题