Android基础练习|Android电话本实现
Android电话本实现
- 需求
- 效果
-
- 添加联系人
- 删除联系人
- 查询联系人
- 修改联系人
- 拨打电
- 部分实现代码
-
- 数据库
- 添加联系人
-
- 布局
- 限制添加长度
- 添加页面
-
- 布局
- 代码
- 删除联系人
- 查询联系人
- 修改联系人和拨打电话页面
- 主页面
-
- 布局
- 代码
- 完整项目链接
完整项目下载链接
需求 可以实现联系人的增删改查
可以实现电话的拨打
采用内置数据库
效果 添加联系人
删除联系人
查询联系人
![Android基础练习|Android电话本实现](https://img.it610.com/image/info8/ac17197228ec4c66a5fd39bb019d92fc.gif)
文章图片
修改联系人
拨打电 【Android基础练习|Android电话本实现】
部分实现代码 数据库
//创建数据库
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) {}
添加联系人 布局
-
限制添加长度
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 stubEditable 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);
}
}}
添加页面
布局
-
代码
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 SubmitButtonsaveABook;
private String name,phone;
private MyHelper myHelper;
private SQLiteDatabase db;
private ContentValues values;
private intWRITE_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();
}@Overridepublic 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);
}
}
主页面 布局
代码
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 names=new ArrayList<>();
private ArrayList 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 extendsBaseAdapter{@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);
}}
完整项目链接 完整项目下载链接
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Python基础|Python基础 - 练习1
- 呼吸练习心得
- Android事件传递源码分析
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)