热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android添加联系人信息并读取

Android添加联系人信息并读取效果图题目1.创建一个File文件,路径为mntsdcardtempzhiyuan.txt2.进入主页面后自动从File文件中读取联系人数据,每个item
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>mList;集合 构造一个List>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> mList;

//有参构造方法
public MyAdapter(Context context, List> 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> mList;
private Map 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 length; i++) {
//使用split分割将person数组中的信息用逗号分隔开
String[] split = person[i].split(",");
mMap = new HashMap<>();
//使用循环输出信息
for (int x = 0; x 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);
}
}

推荐阅读
author-avatar
曾让我心碎的你俺_275
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有