一个带有富文本功能的记事本
已经很久没有写过博客了,果真不作项目,一直摸鱼是提不起写博客的兴趣的。可是作项目肝又很痛,就很矛盾,233.
好了进入正题:
今天,要贴的是一个带有富文本功能的记事本。也是我混进实验室考核的第一个项目。下面是要求:git
主界面:github
编辑器:数据库
回收站:编辑器
老规矩(也没什么老不老规矩的),先贴github地址(求star)
https://github.com/egoistor/Nodepad
而后呢,就是谢谢一些CSDN的做者:
首先是https://www.jianshu.com/p/9c2c1416d894,个人富文本基本都是这里来的,固然本身也有学来着,毕竟蠢,仍是多借鉴。
而后是界面贴图:
(https://img-blog.csdnimg.cn/20190131091218330.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_1,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_1,color_FFFFFF,t_1aGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_16,color_FFFFFF,t_70)
(https://img-blog.csdnimg.cn/20190131091601723.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_16,color_FFFFFF,t_70)
(https://img-blog.csdnimg.cn/20190131091700396.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_16,color_FFFFFF,t_70)而后就说说本身此次出现的问题,首先习惯很 重要 重要 重要
好比xml里每个activity的title的hight若是没有设置正确,就会调试到怀疑人生。
还有dialog的show()必定要写。
而后就是在调试的时候灵活使用Logcat,真的很好用,能够看到本身的各类问题。
还有就是LitePal真好用,真香。
我惟一想说的代码问题就是在界面初始化数据库的时候,会出现问题:ide
public void ininDataBase(){ SharedPreferences sharedPreferences=this.getSharedPreferences("share",MODE_PRIVATE); boolean isFirstRun=sharedPreferences.getBoolean("isFirstRun", true); SharedPreferences.Editor editor=sharedPreferences.edit(); if(isFirstRun){ SQLiteDatabase db = LitePal.getDatabase(); editor.putBoolean("isFirstRun", false); editor.commit(); }else{ noteList = LitePal.findAll(Note.class); } }
就是这一片了,问题在于你要判断是不是activity第一次启动,若是是第一次就只初始化数据库,不对数据库进行取数据操做,毕竟没东西,程序会直接崩溃。具体的方法,我想代码已经说的很清楚了,使用 SharedPreferences 进行永久化的判断条件存储,就ok。this
这是一个大一点的问题设计
还有一些小问题,好比什么RecycleView的条目的点击事件的添加,网上有蛮多教程都说的蛮清楚的,果真百度是个好东西。
具体呢:调试
public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener{ private RecyclerViewOnItemClickListener onItemClickListener; private RecyclerViewOnItemLongClickListener onItemLongClickListener; private List<Note> myNoteList; static class ViewHolder extends RecyclerView.ViewHolder{ private View view; TextView NoteName; TextView TimeShow; public ViewHolder(View view){ super(view); this.view=view; NoteName = view.findViewById(R.id.note_message); TimeShow = view.findViewById(R.id.time_shows); } } public NoteAdapter(List<Note> noteList){ myNoteList = noteList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_item, parent, false); ViewHolder holder = new ViewHolder(view); view.setOnClickListener(this); view.setOnLongClickListener(this); return holder; } @Override public void onClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClickListener(v, (Integer) v.getTag()); } } @Override public boolean onLongClick(View v) { return onItemLongClickListener != null && onItemLongClickListener.onItemLongClickListener(v, (Integer) v.getTag()); } public void setRecyclerViewOnItemClickListener(RecyclerViewOnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void setOnItemLongClickListener(RecyclerViewOnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public interface RecyclerViewOnItemClickListener { void onItemClickListener(View view, int position); } public interface RecyclerViewOnItemLongClickListener { boolean onItemLongClickListener(View view, int position); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { Note Note = myNoteList.get(position); holder.NoteName.setText(Note.getMessage()); holder.TimeShow.setText(Note.getYear()+"/"+Note.getMonth()+"/"+Note.getDay()); holder.view.setTag(position); } @Override public int getItemCount() { return myNoteList.size(); } }
在adapter里先对接口进行声明,也就是如上代码。
而后在activity里调用便可。code
最后呢,就是须要改进的地方。xml
还有博友发现了其余问题,欢迎提出。