可以实现联系人的增删改查
可以实现电话的拨打
采用内置数据库
//创建数据库
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context)
{
super(context,"itcast.db",null,2);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE information(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),tels INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/back7"
android:gravity="center">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="30dp"
android:paddingTop="20dp"
android:background="#99404348"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="AddressBook"
android:textColor="#FFFFFF"
android:textSize="18sp"/>-
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="20dp"
android:paddingTop="20dp"
android:background="#99000000">
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:layout_gravity="center"
android:layout_marginRight="50dp"
android:layout_marginLeft="50dp"
android:textColor="#FFFFFF"
android:textColorHint="#9F9FA0"
android:hint="Name"/>
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="#83738F"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"></View>
<EditText
android:id="@+id/etNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:layout_gravity="center"
android:hint="Number"
android:textColor="#FFFFFF"
android:textColorHint="#9F9FA0"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="30dp"
android:paddingTop="20dp"
android:background="#99404348"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="请输入姓名和电话号码"
android:textColor="#DDDDDD"
android:textSize="15sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="©青素"
android:textColor="#FFFFFF"
android:textSize="15sp"/>
</LinearLayout>
<com.spark.submitbutton.SubmitButton
android:id="@+id/btnSave"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:sub_btn_tick_color="@color/white"
android:text="保存联系人"
android:textSize="15sp"
android:textColor="@color/white"
app:sub_btn_duration="3000" />
</LinearLayout>
</LinearLayout>
import android.content.Context;
import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.Toast;
//保证电话号码不超过11位 姓名不超过8个字符
public class MaxLengthWatcher implements TextWatcher {
private int maxLen = 0;
private EditText editText = null;
private Context context=null;
public MaxLengthWatcher(int maxLen, EditText editText, Context context) {
this.maxLen = maxLen;
this.editText = editText;
this.context=context;
}
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
Editable editable = editText.getText();
int len = editable.length();
if(len > maxLen)
{
int selEndIndex = Selection.getSelectionEnd(editable);
String str = editable.toString();
//截取新字符串
String newStr = str.substring(0,maxLen);
editText.setText(newStr);
editable = editText.getText();
//新字符串的长度
int newLen = editable.length();
//旧光标位置超过字符串长度
if(selEndIndex > newLen)
{
selEndIndex = editable.length();
//防止吐司出现应用程序名称提示
Toast toast=Toast.makeText(context,"不能超过"+newLen+"字符长度",Toast.LENGTH_LONG);
toast.setText("不能超过"+newLen+"字符长度");
toast.show();
}
//设置新光标所在的位置
Selection.setSelection(editable, selEndIndex);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/back7"
android:gravity="center">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="30dp"
android:paddingTop="20dp"
android:background="#99404348"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="AddressBook"
android:textColor="#FFFFFF"
android:textSize="18sp"/>-
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="20dp"
android:paddingTop="20dp"
android:background="#99000000">
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:layout_gravity="center"
android:layout_marginRight="50dp"
android:layout_marginLeft="50dp"
android:textColor="#FFFFFF"
android:textColorHint="#9F9FA0"
android:hint="Name"/>
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="#83738F"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"></View>
<EditText
android:id="@+id/etNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:layout_gravity="center"
android:hint="Number"
android:textColor="#FFFFFF"
android:textColorHint="#9F9FA0"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="30dp"
android:paddingTop="20dp"
android:background="#99404348"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="请输入姓名和电话号码"
android:textColor="#DDDDDD"
android:textSize="15sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="©青素"
android:textColor="#FFFFFF"
android:textSize="15sp"/>
</LinearLayout>
<com.spark.submitbutton.SubmitButton
android:id="@+id/btnSave"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:sub_btn_tick_color="@color/white"
android:text="保存联系人"
android:textSize="15sp"
android:textColor="@color/white"
app:sub_btn_duration="3000" />
</LinearLayout>
</LinearLayout>
import android.Manifest;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.spark.submitbutton.SubmitButton;
public class Tels_new extends AppCompatActivity {
private EditText etNameOne,etTelNumberOne;
private SubmitButton saveABook;
private String name,phone;
private MyHelper myHelper;
private SQLiteDatabase db;
private ContentValues values;
private int WRITE_EXTERNAL_STORAGE_REQUEST_CODE=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tels_new);
//隐藏Toolbar的返回箭头
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
myHelper=new MyHelper(this);
etNameOne=(EditText)findViewById(R.id.etName);
etTelNumberOne=(EditText)findViewById(R.id.etNumber);
saveABook=(SubmitButton) findViewById(R.id.btnSave);
//监测
etNameOne.addTextChangedListener(new MaxLengthWatcher(8,etNameOne,this));
etTelNumberOne.addTextChangedListener(new MaxLengthWatcher(11,etTelNumberOne,this));
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE); }
//保存按钮 点击保存
saveABook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SaveABook();
}
});
}
@Override
//权限获取回调
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode,grantResults);
}
//自己用肯定给 先放起来 啥也不干
private void doNext(int requestCode, int[] grantResults)
{
if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else {
}
}
}
//保存联系人
void SaveABook(){
name=etNameOne.getText().toString();
phone=etTelNumberOne.getText().toString();
db=myHelper.getWritableDatabase();
values=new ContentValues();
values.put("name",name);
values.put("tels",phone);
db.insert("information",null,values);
db.close();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate( R.menu.back, menu);
return true;
}
//使用菜单返回上一级
public boolean onOptionsItemSelected(MenuItem item)
{
if(item.getItemId()==R.id.action_settings1) {
Intent intent = new Intent(Tels_new.this, MainActivity.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
}
//点击事件 并传入参数
mlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, Change.class);
intent.putExtra("nameInt",names.get(position));
intent.putExtra("telInt",tels.get(position));
startActivity(intent);
}
});
//长按事件 删除数据
mlistview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
//长按删除
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,final int arg2, long arg3) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
db=myHelper.getWritableDatabase();
db.delete("information","name=?",new String[]{
names.get(arg2)});
db.close();
names.remove(arg2);
tels.remove(arg2);
madapter.notifyDataSetChanged();
}
});
builder.create().show();
return true; // 这里一定要改为true,代表长按自己消费掉了,若为false,触发长按事件的同时,还会触发点击事件
}
});
}
//完成搜索功能
searchBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myHelper=new MyHelper(MainActivity.this);
db=myHelper.getWritableDatabase();
names.clear ();
tels.clear();
Cursor cursor=db.query("information",null,"name=?",new String[]{
searchEt.getText().toString()},null,null,null);
if(cursor.getCount()!=0)
{
cursor.moveToFirst();
names.add(cursor.getString(1));
tels.add(cursor.getString(2));
while(cursor.moveToNext())
{
names.add(cursor.getString(1));
tels.add(cursor.getString(2));}
}else{
cursor=db.query("information",null,null,null,null,null,null);
Toast toast=Toast.makeText(MainActivity.this,"抱歉,未发现该联系人!",Toast.LENGTH_LONG);
toast.setText("抱歉,未发现该联系人!");
toast.show();
}
madapter.notifyDataSetChanged();
cursor.close();
db.close();}
});
import android.Manifest;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class Change extends AppCompatActivity {
private EditText nameTwo,numberTwo;
private ImageView modify,call;
private MyHelper myHelper;
private SQLiteDatabase db;
private ContentValues values;
private String name;
private String telnumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change);
//隐藏Toolbar的返回箭头
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
myHelper=new MyHelper(this);
//接收传入的电话数据
Intent intent=getIntent();
name=intent.getStringExtra("nameInt");
telnumber=intent.getStringExtra("telInt");
nameTwo=(EditText)findViewById(R.id.etNameTwo);
numberTwo=(EditText)findViewById(R.id.etNumberTwo);
nameTwo.setText(name);
numberTwo.setText(telnumber);
//监测文本长度
nameTwo.addTextChangedListener(new MaxLengthWatcher(8,nameTwo,this));
numberTwo.addTextChangedListener(new MaxLengthWatcher(11,numberTwo,this));
//两个图片按钮
modify=findViewById(R.id.imVmodify);
call=findViewById(R.id.imVcall);
modify.setClickable(true);//激活按钮
call.setClickable(true);
//修改
modify.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
db=myHelper.getWritableDatabase();//初始化数据库
values=new ContentValues();
values.put("name",nameTwo.getText().toString());
values.put("tels",numberTwo.getText().toString());
db.update("information",values,"name=?",new String[]{
name});
//防止吐司出现应用程序名称提示
Toast toast=Toast.makeText(Change.this,"修改成功",Toast.LENGTH_LONG);
toast.setText("修改成功");
toast.show();
db.close();
}
});
//拨打
call.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(Change.this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(Change.this,new String[]{
Manifest.permission.CALL_PHONE},1);
}else {
}
//拨打电话
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);//设置活动类型
intent.setData(Uri.parse("tel:"+telnumber));//设置数据
startActivity(intent);
}
});
}
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate( R.menu.back, menu);
return true;
}
//使用菜单返回上一级
public boolean onOptionsItemSelected(MenuItem item)
{
if(item.getItemId()==R.id.action_settings1) {
Intent intent = new Intent(Change.this, MainActivity.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/back3"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="5dp">
<EditText
android:id="@+id/etSearch"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="5"
android:background="#ffffff"
android:ems="10"
android:gravity="center"
android:hint="搜索联系人"
android:inputType="textPersonName"
android:textSize="25sp" />
<ImageView
android:id="@+id/imgsearch"
android:layout_marginTop="3dp"
android:layout_width="50dp"
android:layout_height="39dp"
app:srcCompat="@android:drawable/ic_menu_search" />
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:layout_centerVertical="true"
android:gravity="center"
android:layout_marginEnd="20dp"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ListView mlistview;
private ImageView searchBt;
private EditText searchEt;
private MyHelper myHelper;
private SQLiteDatabase db;
private ArrayList<String> names=new ArrayList<>();
private ArrayList<String> tels=new ArrayList<>();
private MyBaseAdapter madapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化listview
mlistview=(ListView) findViewById(R.id.listView);
madapter=new MyBaseAdapter();
mlistview.setAdapter(madapter);
myHelper=new MyHelper(this);
db=myHelper.getWritableDatabase();
//查询所有数据 显示页面
Cursor cursor=db.query("information",null,null,null,null,null,null);
if(cursor.getCount()==0)
{
//防止吐司出现应用程序名称提示
Toast toast=Toast.makeText(MainActivity.this,"暂时没有联系人请添加!",Toast.LENGTH_LONG);
toast.setText("暂时没有联系人请添加!");
toast.show();
}else{
//第一个
cursor.moveToFirst();
names.add(cursor.getString(1));
tels.add(cursor.getString(2));
//下一个直到没有
while(cursor.moveToNext())
{
names.add(cursor.getString(1));
tels.add(cursor.getString(2));
}
madapter.notifyDataSetChanged();//动态更新
cursor.close();
db.close();
}
searchBt=(ImageView)findViewById(R.id.imgsearch);
searchEt=(EditText)findViewById(R.id.etSearch);
searchEt.addTextChangedListener(new MaxLengthWatcher(8,searchEt,this));
searchBt.setClickable(true);//激活按钮
//完成搜索功能
searchBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myHelper=new MyHelper(MainActivity.this);
db=myHelper.getWritableDatabase();
names.clear ();
tels.clear();
Cursor cursor=db.query("information",null,"name=?",new String[]{
searchEt.getText().toString()},null,null,null);
if(cursor.getCount()!=0)
{
cursor.moveToFirst();
names.add(cursor.getString(1));
tels.add(cursor.getString(2));
while(cursor.moveToNext())
{
names.add(cursor.getString(1));
tels.add(cursor.getString(2));}
}else{
cursor=db.query("information",null,null,null,null,null,null);
Toast toast=Toast.makeText(MainActivity.this,"抱歉,未发现该联系人!",Toast.LENGTH_LONG);
toast.setText("抱歉,未发现该联系人!");
toast.show();
}
madapter.notifyDataSetChanged();
cursor.close();
db.close();}
});
//点击事件 并传入参数
mlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, Change.class);
intent.putExtra("nameInt",names.get(position));
intent.putExtra("telInt",tels.get(position));
startActivity(intent);
}
});
//长按事件 删除数据
mlistview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
//长按删除
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,final int arg2, long arg3) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
db=myHelper.getWritableDatabase();
db.delete("information","name=?",new String[]{
names.get(arg2)});
db.close();
names.remove(arg2);
tels.remove(arg2);
madapter.notifyDataSetChanged();
}
});
builder.create().show();
return true; // 这里一定要改为true,代表长按自己消费掉了,若为false,触发长按事件的同时,还会触发点击事件
}
});
}
//适配器创建
class MyBaseAdapter extends BaseAdapter{
@Override
public int getCount() {
return names.size();
}
@Override
public Object getItem(int position) {
return names.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
//读取数据并显示
public View getView(int position, View convertView, ViewGroup parent) {
View view=View.inflate(MainActivity.this,R.layout.tel,null);
TextView mtextView=(TextView) view.findViewById(R.id.textView);
mtextView.setText(" "+names.get(position)+" : "+tels.get(position));
return view;
}
}
@Override
//创建菜单
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate( R.menu.main , menu);
return true;
}
//跳转新建联系人页面
public boolean onOptionsItemSelected(MenuItem item)
{
if(item.getItemId()==R.id.action_settings) {
Intent intent = new Intent(MainActivity.this,Tels_new.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
}
完整项目下载链接