栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

安卓开发日记APP史上最详细(SharedPreferences+Room)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

安卓开发日记APP史上最详细(SharedPreferences+Room)

 

 

功能实现
  • 一、登陆界面使用SharedPreferences存储账号密码数据
  • 二、日记栏列表界面实现搜索功能(用到Room)
  • 三、日记栏界面实现添加日记功能(用到Room)
  • 四、日记栏界面长按item实现删除和修改功能(用到Room)
运行结果

 

 

我的代码: 

 

 

 布局:

登陆界面:activity_main.xml




    

    

    
    

    

    
    

日记栏recyclerview界面:activity_diary_main.xml




    

    


 日记编辑界面:activity_edit_diary.xml




    

    

    

    

    

    

 日记编辑界面的actionbar:myactionbar.xml



    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:paddingLeft="10dp"
    android:paddingRight="10dp" >


    

    

    


 

 recyclerview的item布局:recyclerview_row_item.xml




    

        

        

            

            
        
    

长按item的上下文菜单:diary_context_menu.xml




    
    

recyclerview主界面的菜单布局:diary_menu.xml




    
代码实现:

MainActivity:

package com.example.diaryapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText et_user;
    private EditText et_password;
    private CheckBox cb_remember;
    private Button bt_login;

    private View.OnClickListener listener1=new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.login:
                    login();
                    break;
            }
        }
    };

    public void init(){
        et_user=(EditText) findViewById(R.id.user);
        et_password=(EditText) findViewById(R.id.password);
        cb_remember=(CheckBox) findViewById(R.id.remember);
        bt_login=(Button) findViewById(R.id.login);
        bt_login.setOnClickListener(listener1);
    }

    public void login(){
        if(cb_remember.isChecked()){
            rememberme();
        }else{
            unrememberme();
        }

        Intent intent=new Intent(MainActivity.this,DiaryMain.class);
        intent.putExtra("isUpdate","nocreate");
        startActivity(intent);

    }

    private void unrememberme() {
        SharedPreferences sp=getSharedPreferences("mydata",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=sp.edit();

        editor.clear();
        editor.apply();

        Log.d("flag","数据已删除");
    }

    private void rememberme() {
        String username=et_user.getText().toString();
        String password=et_password.getText().toString();

        SharedPreferences sp=getSharedPreferences("mydata", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=sp.edit();

        editor.putBoolean("remember",true);
        editor.putString("username",username);
        editor.putString("password",password);
        editor.apply();

        Log.d("flag","数据保存成功");
    }

    public void readSP(){
        SharedPreferences sp=getSharedPreferences("mydata",Context.MODE_PRIVATE);
        Boolean remember=sp.getBoolean("remember",false);
        if(remember){
            cb_remember.setChecked(true);
            String username=sp.getString("username","");
            String password=sp.getString("password","");
            et_user.setText(username);
            et_password.setText(password);

            Log.d("flag","数据读取成功");
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //设置为全屏模式
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        init();
        readSP();

    }


}

DiaryMain:

package com.example.diaryapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.room.Database;
import androidx.room.Room;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SearchView;

import com.example.diaryapplication.adapter.CustomAdapter;
import com.example.diaryapplication.dao.DiaryDao;
import com.example.diaryapplication.db.AppDatabase;
import com.example.diaryapplication.entity.Diary;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;

public class DiaryMain extends AppCompatActivity {
    private List list=new ArrayList<>();
    private ImageButton btn_add;
    private RecyclerView recyclerView;
    private CustomAdapter adapter;
    private int id_count=0;
    private AppDatabase db;
    private DiaryDao diaryDao;


    View.OnClickListener listener=new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent=new Intent(DiaryMain.this,EditDiary.class);
            intent.setAction("create");
            startActivity(intent);
        }
    };

    public void initDatabase(){
        db= Room.databaseBuilder(getApplicationContext(), AppDatabase.class,"mydb")
                .allowMainThreadQueries()
                .build();
        diaryDao=db.diaryDao();
    }

    public void init(){
        btn_add=(ImageButton) findViewById(R.id.btn_add);
        recyclerView=(RecyclerView) findViewById(R.id.recyclerview);
        btn_add.setOnClickListener(listener);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        adapter = new CustomAdapter(list);
        recyclerView.setAdapter(adapter);

        registerForContextMenu(recyclerView);


    }


    public void updateList(){
        if(getIntent()!=null){
            list=diaryDao.getAll();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_diary_main);

        //让键盘弹出来是,内容不整体上移
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

        //设置为全屏模式
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //ActionBar显示返回按钮
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        initDatabase();
        updateList();
        init();


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.diary_menu,menu);
        MenuItem searchItem=menu.findItem(R.id.item_search);
        SearchView searchView=(SearchView) searchItem.getActionView();
        searchView.setQueryHint("搜索");

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                list=diaryDao.getRequiredDiary(s);
                adapter.setList(list);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                list=diaryDao.getRequiredDiary(s);
                adapter.setList(list);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch ( item.getItemId() ) {
            case android.R.id.home:
                Intent intent=new Intent(DiaryMain.this,MainActivity.class);
                startActivity(intent);
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.diary_context_menu,menu);
    }

    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        int position=adapter.getPosition();

        switch (item.getItemId()){
            case R.id.menu_delete:
                removeItem(position);
                break;
            case R.id.menu_update:
                Intent intent=new Intent(DiaryMain.this,EditDiary.class);
                intent.setAction("update");
                intent.putExtra("idInDatabase",list.get(position).getId());
                startActivity(intent);
                break;
        }
        return true;
    }

    private void removeItem(int position) {
        diaryDao.delete(list.get(position));//数据库相应的也要删除
        list.remove(position);
        adapter.notifyItemRemoved(position);
//        adapter.setList(list);

    }

}

EditDiary:

package com.example.diaryapplication;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.diaryapplication.dao.DiaryDao;
import com.example.diaryapplication.db.AppDatabase;
import com.example.diaryapplication.entity.Diary;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

public class EditDiary extends AppCompatActivity {
    private ImageView iv_return;
    private ImageView iv_confirm;
    private TextView tv_edit_date;
    private EditText et_edit_title;
    private EditText et_edit_content;

    private long currentTimeMillis;//目前的时间
    private String title;
    private String content;
    private AppDatabase db;
    private DiaryDao diaryDao;
    private boolean flag=false;//记录是否保存



    View.OnClickListener listener=new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.iv_return:
                    Intent intent=new Intent(EditDiary.this,DiaryMain.class);
                    if(getIntent().getAction().equals("create")&&flag==true){//执行创建一个新日记并且进行了保存
                        intent.putExtra("isUpdate","createnew");
                    }else{
                        intent.putExtra("isUpdate","nocreate");
                    }
                    startActivity(intent);
                    break;
                case R.id.iv_confirm:
                    //判断内容是否完善,未完善则弹出提示框
                    if(et_edit_title.getText().toString().equals("")||et_edit_content.getText().toString().equals("")){
                        new AlertDialog.Builder( EditDiary.this )
                                .setIcon( R.drawable.alert )
                                .setTitle("提示")
                                .setMessage("标题或内容未填写,请完善!")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        return;
                                    }
                                })
                                .show();
                        return;
                    }

                    collectAndSaveInfo();
                    flag=true;
                    Toast.makeText(EditDiary.this,"数据已保存",Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    //收集信息并保存到数据库中
    public void collectAndSaveInfo(){
        title=et_edit_title.getText().toString();
        content=et_edit_content.getText().toString();

        if(getIntent().getAction().equals("update")){
            Intent intent=getIntent();
            int id=intent.getIntExtra("idInDatabase",-1);
            Diary diary=diaryDao.findDiary(id);
            diary.setTitle(title);
            diary.setContent(content);
            diaryDao.update(diary);


        }else if(getIntent().getAction().equals("create")){
            Diary diary=new Diary();
            diary.setTitle(title);
            diary.setDate(String.valueOf(currentTimeMillis));
            diary.setContent(content);
            diaryDao.insert(diary);
        }

    }

    public void initDatabase(){
        db= Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"mydb")
                .allowMainThreadQueries()
                .build();
        diaryDao=db.diaryDao();
    }

    public void init(){
        iv_return=(ImageView) findViewById(R.id.iv_return);
        iv_confirm=(ImageView) findViewById(R.id.iv_confirm);
        tv_edit_date=(TextView) findViewById(R.id.tv_edit_date);
        et_edit_title=(EditText) findViewById(R.id.et_edit_title);
        et_edit_content=(EditText) findViewById(R.id.et_edit_content);

        iv_return.setOnClickListener(listener);
        iv_confirm.setOnClickListener(listener);

        if(getIntent().getAction().equals("update")){
            Intent intent=getIntent();
            int id=intent.getIntExtra("idInDatabase",-1);
            if(id!=-1){
                Diary diary=diaryDao.findDiary(id);

                currentTimeMillis=Long.valueOf(diary.getDate());
                tv_edit_date.setText(changeTime(currentTimeMillis));
                et_edit_title.setText(diary.getTitle());
                et_edit_content.setText(diary.getContent());
            }
        }else if(getIntent().getAction().equals("create")){
            //初始化当前时间
            currentTimeMillis=System.currentTimeMillis();
            tv_edit_date.setText(changeTime(currentTimeMillis));
        }

    }
    public String changeTime(Long timeMillis){
        SimpleDateFormat sdf_8 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        sdf_8.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
        return sdf_8.format(timeMillis);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_diary);

        //让键盘弹出来是,内容不整体上移
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

        //设置为全屏模式
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setCustomActionBar();

        initDatabase();
        init();


        List diarylist=diaryDao.getAll();
        for(Diary diary:diarylist){
            Log.d("data",String.valueOf(diary.getId()));
            Log.d("data",diary.getDate());
            Log.d("data",diary.getTitle());
            Log.d("data",diary.getContent());
        }

    }

    //自定义actionbar
    private void setCustomActionBar() {
        ActionBar.LayoutParams lp = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT, Gravity.CENTER);
        View mActionBarView = LayoutInflater.from(this).inflate(R.layout.myactionbar, null);
        ActionBar actionBar = this.getSupportActionBar();
        actionBar.setCustomView(mActionBarView, lp);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
    }
}

实体类:Diary

package com.example.diaryapplication.entity;

import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "Diaries")
public class Diary {
    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name="title")
    private String title;

    @ColumnInfo(name="date")
    private String date;

    @ColumnInfo(name="content")
    private String content;

    public Diary() {
    }

    public Diary(int id, String title, String date, String content) {
        this.id = id;
        this.title = title;
        this.date = date;
        this.content = content;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

适配器adapter:

package com.example.diaryapplication.adapter;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.diaryapplication.R;
import com.example.diaryapplication.entity.Diary;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.TimeZone;

public class CustomAdapter extends RecyclerView.Adapter{
    private int position;
    private List list;
    int count=0;

    public CustomAdapter(List list) {
        this.list = list;
    }

    public int getPosition() {
        return position;
    }
    public void setPosition(int position) {
        this.position = position;
    }

    //用于获得删选过后的recyclerview的数据集
    public void setList(List list){
        count=0;//计数需要清零
        this.list=list;
        notifyDataSetChanged();
    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_row_item, parent, false);
        ViewHolder viewHolder=new ViewHolder(view);

        viewHolder.itemView.setLongClickable(true);
        viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                setPosition(viewHolder.getAdapterPosition());
                return false;
            }
        });
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Log.d("myflag","yyy");
        Diary diary=list.get(position);
        holder.tv_id.setText(String.valueOf(++count));
        holder.tv_title.setText(diary.getTitle());

        //转换时间格式
        Long currentTimeMillis = Long.valueOf(diary.getDate());
        SimpleDateFormat sdf_8 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        sdf_8.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
        holder.tv_date.setText(sdf_8.format(currentTimeMillis));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{
        TextView tv_id;
        TextView tv_title;
        TextView tv_date;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_id=(TextView) itemView.findViewById(R.id.tv_id);
            tv_title=(TextView) itemView.findViewById(R.id.tv_title);
            tv_date=(TextView) itemView.findViewById(R.id.tv_date);

        }
    }
}

dao接口:

package com.example.diaryapplication.dao;

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;

import com.example.diaryapplication.entity.Diary;

import java.util.List;

@Dao
public interface DiaryDao {
    //根据日期降序排序
    @Query("SELECT * FROM Diaries ORDER BY CAST(date AS DECIMAL)DESC")
    List getAll();

    @Query("SELECt * FROM Diaries WHERe id=:id")
    Diary findDiary(int id);

    @Query("SELECt * FROM Diaries WHERe title LIKE '%'||:searchName||'%'")
    List getRequiredDiary(String searchName);

    @Insert
    void insert(Diary diary);

    @Delete
    void delete(Diary diary);

    @Update
    void update(Diary diary);

}

AppDatabase:

package com.example.diaryapplication.db;

import androidx.room.Database;
import androidx.room.RoomDatabase;

import com.example.diaryapplication.dao.DiaryDao;
import com.example.diaryapplication.entity.Diary;

@Database(entities = {Diary.class},version = 1)
public abstract class AppDatabase extends RoomDatabase{
    public abstract DiaryDao diaryDao();
}

作者也是安卓初学者,请多指教。

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/881238.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号