Android基础练习|Android电话本实现


Android电话本实现

  • 需求
  • 效果
    • 添加联系人
    • 删除联系人
    • 查询联系人
    • 修改联系人
    • 拨打电
  • 部分实现代码
    • 数据库
    • 添加联系人
      • 布局
      • 限制添加长度
      • 添加页面
        • 布局
        • 代码
    • 删除联系人
    • 查询联系人
    • 修改联系人和拨打电话页面
    • 主页面
      • 布局
      • 代码
  • 完整项目链接

完整项目下载链接
需求 可以实现联系人的增删改查
可以实现电话的拨打
采用内置数据库
效果 添加联系人
删除联系人
查询联系人 Android基础练习|Android电话本实现
文章图片

修改联系人
拨打电 【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); }}

完整项目链接 完整项目下载链接

    推荐阅读