小工具知识网

当前位置: 首页 > 行业知识 > android studio项目实战——备忘录(附源码)

行业知识

android studio项目实战——备忘录(附源码)

2026-11-03 06:18:14 来源:互联网转载

成果展示:

 1.前期准备

(1)在配置文件中添加权限及启动页面顺序

①展开工程,打开app下方的AndroidManifest.xml,添加权限,如下:

② 依旧在AndroidManifest.xml文件中添加启动页面顺序的功能代码

        //这里注意修改成自己创建的包名                                                                                                                    

(2)添加依赖

展开工程,打开app下方的build.gradle ,添加依赖,如下:依赖添加好之后,要记着同步,在页面右上角的位置单击:Sync Now  即可。

implementation 'com.android.support:recyclerview-v7:+'
implementation 'com.github.bumptech.glide:glide:4.9.0'
api 'com.blankj:utilcode:1.23.7'

(3)素材

一共5张图片,粘贴到工程的drawable文件夹下来,其中bgone.png,bgthree.jpg两个图片是登录界面和信息添加界面的背景,buttonbg.png,savebg.png图片是添加备忘录按钮和保存按钮的背景,另外一张背景图片是sunshine.jpg是一张默认显示的照片。选择你自己喜欢的图片添加进去吧!

2.所需的布局文件

 2.1 activity_login.xml

登录布局界面的实现

                                                                                

2.2 activity_main.xml文件代码:

添加备忘录界面

            

 2.3 activity_add_info.xml文件代码:

备忘录信息添加布局界面

                                                    

 2.4 recy_item.xml文件代码:

主界面--子布局界面

                                                

3.所需的java类文件

以下是所需要添加的package,及java类文件。

package所需要添加的文件有adapter、bean、db三个package包。

java类文件除了开始的主文件MainActivity,还需添加MemoAdapter、MemoBean、MydbHelper、AddInfoActivity、LoginActivity5个java类文件。

 3.1 MemoAdapter文件代码:

备忘录的自定义适配器功能代码

package com.example.ts_menu.adapter;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.database.sqlite.SQLiteDatabase;import android.graphics.Color;import android.graphics.drawable.GradientDrawable;import android.os.Build;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import androidx.annotation.NonNull;import androidx.annotation.RequiresApi;import androidx.recyclerview.widget.RecyclerView;import com.bumptech.glide.Glide;import com.example.ts_menu.R;import com.example.ts_menu.bean.MemoBean;import com.example.ts_menu.db.MyDbHelper;import java.util.List;import java.util.Random;//1 类文件后面添加泛型//2 鼠标定位类文件行红色波浪线处,Alt+Enter键:添加未实现的方法//3 鼠标定位类文件行ViewHolder处,Alt+Enter键:添加内部类//4 鼠标定位界面最下方内部类ViewHolder处,添加extends  RecyclerView.ViewHolder//5 鼠标定位界面最下方内部类ViewHolder红色波浪线处,Alt+Enter键:添加构造方法//6 定义两个对象:上下文环境和数组//7 定义两个对象下方的空白处:Alt+Insert键,添加适配器的构造方法public class MemoAdapter extends RecyclerView.Adapter  {    private Context mcontext;    private List arr1;    private MyDbHelper mhelper1;    private SQLiteDatabase db;    public MemoAdapter(Context mcontext, List arr1) {        this.mcontext = mcontext;        this.arr1 = arr1;    }    //负责加载item布局    @NonNull    @Override    public MemoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {        View view= LayoutInflater.from(mcontext).inflate(R.layout.recy_item,parent,false);        ViewHolder mholder=new ViewHolder(view);        return mholder;    }    //负责加载item的数据    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)    @Override    public void onBindViewHolder(@NonNull MemoAdapter.ViewHolder mholder, final int i) {        final MemoBean memoBean=arr1.get(i);        mholder.item_title.setText(memoBean.getTitle());        mholder.item_content.setText(memoBean.getContent());        mholder.item_time.setText(memoBean.getTime());        Glide.with(mcontext).load(memoBean.getImgpath()).into(mholder.item_img);        // 完善:设置RecyclerView中每一个子项的颜色和形状        Random random = new Random();        int color = Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256));        GradientDrawable gradientDrawable = new GradientDrawable();        gradientDrawable.setShape(GradientDrawable.RECTANGLE);//形状        gradientDrawable.setCornerRadius(10f);//设置圆角Radius        gradientDrawable.setColor(color);//颜色        mholder.item_layout.setBackground(gradientDrawable);//设置为background        //完善:单击其中的一个子项,弹出删除功能        mholder.item_layout.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //弹出对话框,删除                AlertDialog.Builder dialog=new AlertDialog.Builder(mcontext);                dialog.setMessage("确定删除吗?");                dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int abc) {                        //从数据库当中删除掉                        mhelper1= new MyDbHelper(mcontext);                        db=mhelper1.getWritableDatabase();                        db.delete("tb_memory","title=?",new String[]{arr1.get(i).getTitle()});                        arr1.remove(i);                        notifyItemRemoved(i);                        dialogInterface.dismiss();                    }                });                dialog.setNegativeButton("取消",null);                dialog.setCancelable(false);                dialog.create();                dialog.show();            }        });    }    //recyView一共有多少个子项    @Override    public int getItemCount() {        return arr1.size();    }    public class ViewHolder  extends  RecyclerView.ViewHolder{        TextView item_title,item_content,item_time;        ImageView item_img;        LinearLayout item_layout;        public ViewHolder(@NonNull View itemView) {            super(itemView);            item_title=itemView.findViewById(R.id.item_title);            item_content=itemView.findViewById(R.id.item_content);            item_img=itemView.findViewById(R.id.item_image);            item_time=itemView.findViewById(R.id.item_time);            item_layout=itemView.findViewById(R.id.item_layout);        }    }}

3.2 MemoBean文件代码: 

一个javabean文件,为了存储备忘录的信息

package com.example.ts_menu.bean;public class MemoBean {        private  String title;        private String content;        private String imgpath;        private String time;        public MemoBean(String title, String content, String imgpath, String time) {            this.title = title;            this.content = content;            this.imgpath = imgpath;            this.time = time;        }        public String getTitle() {            return title;        }        public void setTitle(String title) {            this.title = title;        }        public String getContent() {            return content;        }        public void setContent(String content) {            this.content = content;        }        public String getImgpath() {            return imgpath;        }        public void setImgpath(String imgpath) {            this.imgpath = imgpath;        }        public String getTime() {            return time;        }        public void setTime(String time) {            this.time = time;        }    }

3.3 MydbHelper文件代码: 

数据库文件

package com.example.ts_menu.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class MyDbHelper extends SQLiteOpenHelper {    private  static String DBNAME="zsmemo.db";    private  static int VERSION=1;    //构造方法    public MyDbHelper( Context context) {        super(context, DBNAME, null, VERSION);    }    // 创建数据库    @Override    public void onCreate(SQLiteDatabase db) {        //创建数据表        db.execSQL("create table tb_memory(_id Integer primary key,title String (200),content String (2000),imgpath String (200),mtime String (50))");    }    //升级数据库    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {    }}

3.4 AddInfoActivity文件代码: 

 拍照功能直接闪退:

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){    StrictMode.VmPolicy.Builder builder=new StrictMode.VmPolicy.Builder();    StrictMode.setVmPolicy(builder.build());}

使用上述代码防止闪退。

在拍照功能时应该将保存路径代码改为tmp_path=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath()+"/image"+randtime+".jpg";

有效防止拍照后确定不了问题。

package com.example.ts_menu;import android.content.ContentValues;import android.content.Intent;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.os.Bundle;import android.text.format.Time;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import com.blankj.utilcode.util.UriUtils;import com.bumptech.glide.Glide;import com.example.ts_menu.db.MyDbHelper;import com.example.ts_menu.db.MyDbHelper;import java.io.File;import java.io.IOException;public class AddInfoActivity extends AppCompatActivity {    //定义对象    EditText edit_title,edit_content;    Button btn_camera,btn_photo,btn_save;    ImageView img_preview;    String tmp_path,disp_path;    MyDbHelper mhelper;    SQLiteDatabase db;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_add_info);        //1 绑定控件        initView();        //2 单击按钮、拍照、从图库中选择照片        btnOnClick();        //3 接受拍好照片、接受从图库当中选择的照片 ------方法:系统回调        //4 把信息保存到数据库中        btnSave();    }    //1 绑定控件-----代码    private void initView() {        edit_title=findViewById(R.id.editText_title);        edit_content=findViewById(R.id.editText_content);        btn_camera=findViewById(R.id.button_camera);        btn_photo=findViewById(R.id.button_photo);        img_preview=findViewById(R.id.imageView_preview);        btn_save=findViewById(R.id.button_save);        mhelper=new MyDbHelper(AddInfoActivity.this);        db= mhelper.getWritableDatabase();    }    //2 单击按钮、拍照----------代码    private void btnOnClick() {        btn_camera.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //拍照                Time time=new Time();                time.setToNow();                String randtime=time.year+(time.month+1)+time.monthDay+time.hour+time.minute+time.second+"";               // tmp_path= Environment.getExternalStorageDirectory()+"/image"+ randtime+".jpg";                  tmp_path=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath()+"/image"+randtime+".jpg";                File imgfile=new File(tmp_path);                try {                    imgfile.createNewFile();                } catch (IOException e) {                    e.printStackTrace();                }                Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imgfile) );                startActivityForResult(intent,11);            }        });        btn_photo.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //选择照片                Intent intent=new Intent("android.intent.action.GET_CONTENT");                intent.setType("image/*");                startActivityForResult(intent,22);            }        });    }    //3 接受拍好照片、接受从图库当中选择的照片 ------方法:系统回调    @Override    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {        switch (requestCode){            case 11:                if(resultCode==RESULT_OK){                    disp_path=tmp_path;                    Glide.with(AddInfoActivity.this).load(disp_path).into(img_preview);                }                break;            case 22:                Uri imageuri=data.getData();                if (imageuri==null)                {                    return;                }                disp_path=UriUtils.uri2File(imageuri).getPath();                Glide.with(AddInfoActivity.this).load(disp_path).into(img_preview);                break;            default:                break;        }    }    //4 把信息保存到数据库中-------------代码    private void btnSave() {        btn_save.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //保存信息到数据库代码                Time time=new Time();                time.setToNow();                ContentValues contentValues=new ContentValues();//一行                contentValues.put("title",edit_title.getText().toString());//1行——1列                contentValues.put("content",edit_content.getText().toString());//1行——3列                contentValues.put("imgpath",disp_path);                contentValues.put("mtime",time.year+"/"+(time.month+1)+"/"+time.monthDay);                db.insert("tb_memory",null,contentValues);                Toast.makeText(AddInfoActivity.this,"保存成功",Toast.LENGTH_SHORT).show();                //跳转到主界面                Intent intent=new Intent(AddInfoActivity.this,MainActivity.class);                startActivity(intent);                finish();            }        });    }}

3.5 LoginActivity文件代码:

package com.example.ts_menu;import android.content.Intent;import android.content.SharedPreferences;//import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import androidx.appcompat.app.AppCompatActivity;public class LoginActivity extends AppCompatActivity {    //定义对象    private EditText edit_inputname,edit_inputpwd;    private CheckBox check_reme;    private Button btn_login;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_login);        //1 绑定控件        initView();        //2 单击登录按钮,将用户名和密码保存起来        btnloginonClick();        //3 下次启动,直接显示用户名和密码        displayinfo();    }    //1 绑定控件--------代码    private void initView() {        edit_inputname=findViewById(R.id.editText_inputname);        edit_inputpwd=findViewById(R.id.editText_inputpwd);        check_reme=findViewById(R.id.checkBox_reme);        btn_login=findViewById(R.id.button_login);    }    //2 单击登录按钮,将用户名和密码保存起来----代码    private void btnloginonClick() {        btn_login.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //保存用户名和密码                SharedPreferences.Editor editor=getSharedPreferences("myinfo",0).edit();                editor.putString("name",edit_inputname.getText().toString());                editor.putString("pwd",edit_inputpwd.getText().toString());                editor.putBoolean("st",check_reme.isChecked());                editor.commit();                //跳转到第二页                Intent intent=new Intent(LoginActivity.this,MainActivity.class);                startActivity(intent);            }        });    }    //3 下次启动,直接显示用户名和密码-----代码    private void displayinfo() {        String strname=getSharedPreferences("myinfo",0).getString("name","");        String strpwd=getSharedPreferences("myinfo",0).getString("pwd","");        Boolean status=getSharedPreferences("myinfo",0).getBoolean("st",false);        if(status==true){            edit_inputname.setText(strname);            edit_inputpwd.setText(strpwd);            check_reme.setChecked(true);        }else{            edit_inputname.setText("");            edit_inputpwd.setText("");            check_reme.setChecked(false);        }    }}

3.6 MainActivity文件代码:

package com.example.ts_menu;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.view.View;import android.widget.Adapter;import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.RecyclerView;import androidx.recyclerview.widget.StaggeredGridLayoutManager;import com.example.ts_menu.adapter.MemoAdapter;import com.example.ts_menu.bean.MemoBean;import com.example.ts_menu.db.MyDbHelper;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    //定义对象    private Button btn_add;    private RecyclerView recy_view;    private MyDbHelper mhelper;    SQLiteDatabase db;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //1 绑定控件        initView();        //2 对单击添加单击事件        btnonclicknext();        //3完善:从数据库获取数据,显示到RecyclerView控件里面        recyDisplay();    }    //1 绑定控件-----------代码    private void initView() {        btn_add=findViewById(R.id.button_add);        recy_view=findViewById(R.id.recy_view);        mhelper=new MyDbHelper(MainActivity.this);        db=mhelper.getWritableDatabase();    }    //2 对单击添加单击事件-----代码    private void btnonclicknext() {        btn_add.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //单击后跳转到一下页                Intent intent=new Intent(MainActivity.this,AddInfoActivity.class);                startActivity(intent);                finish();            }        });    }    //3完善:从数据库获取数据,显示到RecyclerView控件里面---------------代码    private void recyDisplay() {        //3.1准备数据-----------标题、内容、图片、时间(类)        List arr=new ArrayList();        //从数据库里面取数据了        Cursor  cursor=db.rawQuery("select * from tb_memory",null);        while(cursor.moveToNext()){            String mytitle=cursor.getString(cursor.getColumnIndex("title"));            String mycontent=cursor.getString(cursor.getColumnIndex("content"));            String myimgpath=cursor.getString(cursor.getColumnIndex("imgpath"));            String mymtime=cursor.getString(cursor.getColumnIndex("mtime"));            MemoBean memoBean=new MemoBean(mytitle,mycontent,myimgpath,mymtime);            arr.add(memoBean);        }        cursor.close();        //3.2 子布局 recy_item        //3.3 数据------桥(适配器MemoAdapter)----------------子布局        MemoAdapter adapter=new MemoAdapter(MainActivity.this,arr);        //3.4 确定显示的方式        StaggeredGridLayoutManager st=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);        recy_view.setLayoutManager(st);        //3.5 让数据显示出来        recy_view.setAdapter(adapter);    }}

注意:activity文件中相关的名称报错,得换成自己所创建工程的名字。

上一篇:ug6怎么启动服务器?

下一篇:怎么开设彩票服务器账号?