软件介绍下载

该软件是本人学习安卓开发而创作的一款通知提醒、笔记创作的app,笔记可以选择背景图片,更改字体颜色等特色功能。

该软件下载地址https://senzhijing.github.io/xiaowangzi/app-release.apk

GitHub地址: xiaowangzi/app-release.apk at main · SenZhijing/xiaowangzi · GitHub

效果图

部分功能代码

ruturnBar,自定义组件由于子组件太少,所以直接在代码中添加子组件了


import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;import abc.szj.myapps.R;public class ReturnBur extends Toolbar{public ReturnBur(@NonNull  Context context) {super(context);initView(context);}public ReturnBur(@NonNull  Context context, @Nullable  AttributeSet attrs) {super(context, attrs);initView(context);}TextView title;/*** 获取自定的标题,用来设置标题;* @return*/public TextView gettitle() {return title;}private void initView(Context context){ImageButton fanhui=new ImageButton(context);fanhui.setBackgroundColor(Color.TRANSPARENT);fanhui.setImageResource(R.drawable.back);fanhui.setOnClickListener(v-> ((Activity) context).finish());addView(fanhui);title=new TextView(context);title.setTextSize(20);title.setText("title");Toolbar.LayoutParams layoutParams=new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER);addView(title,layoutParams);setBackgroundColor(Color.rgb(187,203,218));}
}

sqlOpenHelper sqlite工具类

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;public class SqlOphelper extends SQLiteOpenHelper {public static final String DBName="userdata.db";private SqlOphelper(Context context){super(context,DBName,null,1);}private static SqlOphelper sqlOphelper=null;/*** 获取本类的实例对象* @param context* @return*/public static SqlOphelper getInstance(Context context){if (sqlOphelper==null){sqlOphelper=new SqlOphelper(context);}return sqlOphelper;}private SQLiteDatabase writeDb=null,readDb=null;public SQLiteDatabase getWriteDb(){if (writeDb==null||!writeDb.isOpen()){writeDb=sqlOphelper.getWritableDatabase();}return writeDb;}public SQLiteDatabase getReadDb(){if (readDb==null||!readDb.isOpen()){readDb=sqlOphelper.getReadableDatabase();}return readDb;}public SqlOphelper(@Nullable  Context context, @Nullable  String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}public static final String select="select *from yhtzjl order by id desc";public static final String insert="insert into yhtzjl(tztitle,tzneiron,tzcjsj)values(?,?,?)";public static final String update="update yhtzjl set tztitle=?,tzneiron=? where id=?";public static final String updatebjjl="update yhbjjl set bjtitle=?,bjneiron=?,bjgxsj=?, bjbjt=?,bjnrys=?, nrztdx=? where id=?";public static final String delete="delete from yhtzjl where id=?";public static final String  YHTZb="yhtzjl";public static final String  YHBJb="yhbjjl";@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table yhtzjl(id integer primary key autoincrement,tztitle text unique,tzneiron text not null,tzcjsj text)");db.execSQL("create table yhbjjl(id integer primary key autoincrement,bjtitle text ,bjneiron text ,bjcjsj text,bjgxsj text,zyxdj integer not null,bjbjt text,bjnrys integer,nrztdx integer not null)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {/*switch (newVersion){case 2: db.execSQL("alert table yhbjjl drop constraint unique ");break;default:throw new IllegalStateException("Unexpected value: " + newVersion);}*/}
}

通知编辑页面

package abc.szj.myapps;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.app.AlertDialog;
import android.app.NotificationManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;import abc.szj.myapps.others.TzhiInfo;
import abc.szj.myapps.others.ReturnBur;
import abc.szj.myapps.others.SqlOphelper;
import abc.szj.myapps.others.UtilToast;public class Acty_Notification extends AppCompatActivity {/*** 创建的通知信息*/public TzhiInfo notiInfo;private static final String TAG = "1Acty_Notification";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_notification);ReturnBur toolbar = findViewById(R.id.topbar_tongzhixq_main);setTitle("");toolbar.gettitle().setText("通知编辑");setSupportActionBar(toolbar);initView();}String tzcontent;NotificationManager notificationManager;EditText tzbt, tznr;long tzltzldsqlid=-1;private void initView() {TextView tzcjsj = findViewById(R.id.tzcjsj_tongzhixq_main),tzgxsj = findViewById(R.id.tzgxsj_tongzhixq_main);tzbt = findViewById(R.id.tzhibt_tongzhixq_main);tznr = findViewById(R.id.bjtz_tonzxq_main);notificationManager = getSystemService(NotificationManager.class);Intent syhdInte = getIntent();//        通知更新时间tzgxsj.setText(formatter.format(LocalDateTime.now()));/*  //如果有这个数据就证明是跳转的,就直接不执行以下了tzltzldsqlid= syhdInte.getLongExtra("sqlid", -1);if (tzltzldsqlid != -1) {Cursor query = SqlOphelper.getInstance(this).getReadDb().rawQuery("select *from yhtzjl  where id=?", new String[]{String.valueOf(tzltzldsqlid)});query.moveToNext();notiInfo = new TzhiInfo(query.getString(1), query.getString(2), LocalDateTime.parse(query.getString(3), formatter));notiInfo.sqlid = tzltzldsqlid;tzcjsj.setText(query.getString(3));tzbt.setText(notiInfo.title);tznr.setText(notiInfo.content);query.close();}else {*/positon = syhdInte.getIntExtra("dqtz", -1);if (positon >= 0) {notiInfo = Frm_Notifa.frm_notifa.tzsju.get(positon);tzcjsj.setText(formatter.format(notiInfo.createTime));tzbt.setText(notiInfo.title);tznr.setText(notiInfo.content);} else {LocalDateTime nowd = LocalDateTime.now();//新建该对象notiInfo = new TzhiInfo(nowd, false);tzcjsj.setText(formatter.format(nowd));}
//        }tzcontent=notiInfo.content;}int positon = -1;public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.tzxxbjym, menu);return true;}/*@Overridepublic void setIntent(Intent newIntent) {super.setIntent(newIntent);setIntent(newIntent);}*//*** 删除通知*/private void shanchutz(){if (notiInfo.sqlid==-1){UtilToast.showShortT(this,"该通知还未添加哦");return ;}AlertDialog.Builder builder=new AlertDialog.Builder(this);builder.setTitle("删除通知提醒").setIcon(R.drawable.senbjlogo).setMessage("确认删除吗?").setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {SqlOphelper.getInstance(Acty_Notification.this).getWriteDb().delete(SqlOphelper.YHTZb, "id=?", new String[]{String.valueOf(notiInfo.sqlid)});UtilToast.showShortT(Acty_Notification.this,"删除成功");try {Frm_Notifa.frm_notifa.tzsju.remove(notiInfo);Frm_Notifa.frm_notifa.adapterTonzhilb.notifyDataSetChanged();}catch (NullPointerException e){Log.e(TAG, "onOptionsItemSelected: adapterTonzhilb是空对象");}//取消通知notificationManager.cancel((int) notiInfo.sqlid);//结束活动finish();}});builder.setNegativeButton("取消",null);AlertDialog dialog = builder.create();dialog.show();}/*** 被选中的menu item监听** @param item* @return*/@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {//删除通知,也会取消通知case R.id.menu_sctz:shanchutz();break;case R.id.menu_qxfs:UtilToast.showShortT(this,"通知已从通知栏取消");notificationManager.cancel((int) notiInfo.sqlid);break;case R.id.menu_qxtj:sftj=false;finish();break;}return true;}boolean sftj=true;/*** 返回数据给通知fragment*/@Overrideprotected void onPause() {super.onPause();String tzneiron = tznr.getText().toString();String tztitle = tzbt.getText().toString();if (tztitle.equals("")||!sftj) return;//有就不重复添加,就更新if (tzltzldsqlid==-1&&positon < 0) {Log.d(TAG, "onPause:通知添加成功" + tztitle);notiInfo.content = tzneiron;notiInfo.title = tztitle;Frm_Notifa.frm_notifa.tzcjwc(notiInfo);} else {//一样就不更新if (tzneiron.equals(tzcontent)){return;}Log.d(TAG, "onPause: 通知修改成功");notiInfo.updateTime = LocalDateTime.now();notiInfo.title = tztitle;notiInfo.content = tzneiron;//更新数据库SqlOphelper.getInstance(this).getWriteDb().execSQL(SqlOphelper.update, new Object[]{tztitle, tzneiron, notiInfo.sqlid});//更新列表数据Frm_Notifa.frm_notifa.adapterTonzhilb.notifyItemChanged(positon);}}public static void startThis(Context context, int position) {Intent intent = new Intent(context, Acty_Notification.class);intent.putExtra("dqtz", position);context.startActivity(intent);}
}

通知碎片Fragment类

package abc.szj.myapps;import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ContentValues;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;import java.time.LocalDateTime;
import java.util.ArrayList;import abc.szj.myapps.others.TzhiInfo;
import abc.szj.myapps.others.SqlOphelper;
import abc.szj.myapps.others.UtilToast;public class Frm_Notifa extends Fragment {public final static Frm_Notifa frm_notifa=new Frm_Notifa();View view;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentview= inflater.inflate(R.layout.fragment__notifa, container, false);sqlOphelper=SqlOphelper.getInstance(view.getContext());initview();return view;}private void initview(){Button fastz=view.findViewById(R.id.fstz_Bn_tzhi),tianjtz=view.findViewById(R.id.tjtz_Bn_tzhi);fastz.setOnClickListener(v->{fsontzhi();});tianjtz.setOnClickListener(v->Acty_Notification.startThis(view.getContext(),-1));RecyclerView tzlb=view.findViewById(R.id.tzlb_RV_tzhi);tzlb.setLayoutManager(new LinearLayoutManager(view.getContext()));tzlb.addItemDecoration(new DividerItemDecoration(view.getContext(),DividerItemDecoration.VERTICAL));tzsju=new ArrayList<>(6);getSqlTzsj();adapterTonzhilb=new AdapterTonzhilb(tzsju);tzlb.setAdapter(adapterTonzhilb);//设置通知渠道setNotifiChanel();}private static final String TAG = "1Frm_Notifa";SqlOphelper sqlOphelper;/*** 数据库通知记录数据获取*/public void getSqlTzsj(){Cursor rawQuery =sqlOphelper.getReadDb().rawQuery(SqlOphelper.select, null);while (rawQuery.moveToNext()){TzhiInfo notiInfo=new TzhiInfo(rawQuery.getString(1),rawQuery.getString(2),LocalDateTime.parse(rawQuery.getString(3),Acty_Notification.formatter));notiInfo.sqlid=rawQuery.getInt(0);tzsju.add(notiInfo);}rawQuery.close();}protected void fsontzhi(){for (TzhiInfo notiInfo:tzsju){//是否要发送通知if (notiInfo.sfyfs){//发送通知sendTonzhi(notiInfo);}}}NotificationManager notificationManager;public static final String tzhijudid="123";/*** 开辟通知渠道*/public void setNotifiChanel(){notificationManager=view.getContext().getSystemService(NotificationManager.class);NotificationChannel channel=new NotificationChannel(tzhijudid,"通知提醒",NotificationManager.IMPORTANCE_HIGH);notificationManager.createNotificationChannel(channel);}public void sendTonzhi(TzhiInfo notiInfo){
//        Intent intent=new Intent(view.getContext(),Acty_Notification.class);
//        intent.putExtra("sqlid",notiInfo.sqlid);Notification.Builder builder=new Notification.Builder(view.getContext(),tzhijudid);builder.setContentTitle(notiInfo.title) .setContentText(notiInfo.content).setSmallIcon(R.drawable.notification).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.senbjlogo,null))//常驻通知.setOngoing(true);
//                .setContentIntent(PendingIntent.getActivity(view.getContext(), (int) notiInfo.sqlid,intent,PendingIntent.FLAG_CANCEL_CURRENT));Notification notification = builder.build();//不可被清理掉notification.flags=Notification.FLAG_NO_CLEAR;UtilToast.showShortT(view.getContext(),"发送通知成功");notificationManager.notify((int) notiInfo.sqlid,notification);}protected AdapterTonzhilb adapterTonzhilb;public void tzcjwc(TzhiInfo notiInfo){ContentValues contentValues=new ContentValues();contentValues.put("tztitle",notiInfo.title);contentValues.put("tzneiron",notiInfo.content);contentValues.put("tzcjsj",Acty_Notification.formatter.format(notiInfo.createTime));//插入数据 返回idnotiInfo.sqlid=sqlOphelper.getWriteDb().insert(SqlOphelper.YHTZb,"",contentValues);tzsju.add(0,notiInfo);
//        adapterTonzhilb.datas.add(notiInfo);adapterTonzhilb.notifyDataSetChanged();}public ArrayList<TzhiInfo> tzsju;}

笔记碎片类Fragment

package abc.szj.myapps;import android.database.Cursor;
import android.os.Bundle;import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;import abc.szj.myapps.others.NoteInfo;
import abc.szj.myapps.others.SqlOphelper;
import abc.szj.myapps.others.UtilDateTime;/*** A simple {@link Fragment} subclass.* create an instance of this fragment.*/
public class Frm_Note extends Fragment {public static Frm_Note frm_note=new Frm_Note();View view;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentview=inflater.inflate(R.layout.fragment_note, container, false);sqlOphelper=SqlOphelper.getInstance(view.getContext());initView();return view;}public AdapterNote adapterNote;private void initView(){RecyclerView notelb=view.findViewById(R.id.bjlb_note_RV);notelb.setLayoutManager(new LinearLayoutManager(view.getContext()));Button tjbj=view.findViewById(R.id.bn_tjbj_note);tjbj.setOnClickListener(v->{Acty_Notebiji.StartThis(view.getContext(),-1);});datas=new ArrayList<>(6);getNoteSqlsj();adapterNote=new AdapterNote(datas);notelb.setAdapter(adapterNote);}public ArrayList<NoteInfo> datas;SqlOphelper sqlOphelper;public void getNoteSqlsj() {Cursor cursor = sqlOphelper.getReadDb().rawQuery("select *from "+ SqlOphelper.YHBJb+" order by id desc ", null);while (cursor.moveToNext()){NoteInfo noteInfo=new NoteInfo(cursor.getInt(0),cursor.getString(1),cursor.getString(2),LocalDateTime.parse(cursor.getString(3),UtilDateTime.formatter),LocalDateTime.parse(cursor.getString(4),UtilDateTime.formatter),cursor.getInt(5),cursor.getString(6),cursor.getInt(7),cursor.getInt(8));datas.add(noteInfo);}cursor.close();datas.sort(notePaixu);}public NotePaixu notePaixu=new NotePaixu();class NotePaixu implements Comparator<NoteInfo>{@Overridepublic int compare(NoteInfo o1, NoteInfo o2) {return o1.zyx>o2.zyx?-1:1;}}public void cjwc(NoteInfo noteInfo){datas.add(0,noteInfo);datas.sort(new Comparator<NoteInfo>() {@Overridepublic int compare(NoteInfo o1, NoteInfo o2) {return 0;}});adapterNote.notifyDataSetChanged();}
}

笔记编辑页面类

package abc.szj.myapps;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.app.AlertDialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.time.LocalDateTime;import abc.szj.myapps.others.NoteInfo;
import abc.szj.myapps.others.ReturnBur;
import abc.szj.myapps.others.SqlOphelper;
import abc.szj.myapps.others.UtilDateTime;
import abc.szj.myapps.others.UtilToast;
import top.defaults.colorpicker.ColorPickerPopup;public class Acty_Notebiji extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_notebiji);ReturnBur bur=findViewById(R.id.rb_topb_bjbj);setSupportActionBar(bur);setTitle("");bur.gettitle().setText("笔记页");Intent intent = getIntent();position=intent.getIntExtra("index",-1);initZhuneiron();}int position;EditText et_bjbt, bj_bjnr;String bjpath;private void initZhuneiron(){ImageButton shareB=findViewById(R.id.ib_share_bjbj);shareB.setOnClickListener(v->shareBji(shareB));TextView cjsj=findViewById(R.id.cjsj_tv_bjbj);TextView gxsj=findViewById(R.id.gxsj_tv_bjbj);//主内容,用来设置背景,以及生成分享的图片zhunron=findViewById(R.id.ll_content_bjbj);et_bjbt =findViewById(R.id.bt_et_bjbj);bj_bjnr =findViewById(R.id.nr_et_bjbj);if (position>=0){noteInfo= Frm_Note.frm_note.datas.get(position);cjsj.setText(UtilDateTime.formatter.format(noteInfo.cjsj));bj_bjnr.setText(noteInfo.neir);bj_bjnr.setTextSize(noteInfo.nrztdx);et_bjbt.setTextSize(noteInfo.nrztdx+6);shezhiBijibjtp();bjpath=noteInfo.bjbjtlj;Log.d(TAG, "initZhuneiron: "+noteInfo.bjbjtlj);try {yszsfgg=noteInfo.bjnrys;et_bjbt.setTextColor(yszsfgg);bj_bjnr.setTextColor(yszsfgg);/* //设置颜色et_bjbt.setTextColor(Color.parseColor(noteInfo.bjnrys));bj_bjnr.setTextColor(Color.parseColor(noteInfo.bjnrys));*/}catch (Exception e){Log.d(TAG, "颜色为空 initZhuneiron: "+noteInfo.bjnrys);}bijicontent=noteInfo.biaot+noteInfo.neir;et_bjbt.setText(noteInfo.biaot);gxsj.setText(UtilDateTime.formatter.format(noteInfo.gxsj));}else {noteInfo=new NoteInfo(0,UtilDateTime.getNow());cjsj.setText(UtilDateTime.formatter.format(UtilDateTime.getNow()));gxsj.setText(UtilDateTime.formatter.format(LocalDateTime.now()));}bj_bjnr.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {gxsj.setText(UtilDateTime.formatter.format(UtilDateTime.getNow()));noteInfo.neir=s.toString();}});dqnrzh=noteInfo.nrztdx;dqbtzh=dqnrzh+6;
//        //小于安卓10申请权限
//        if (Build.VERSION.SDK_INT<Build.VERSION_CODES.Q){requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},qingqiuxiePrim);
//        }}String bijicontent;NoteInfo noteInfo;LinearLayout zhunron;/**分享笔记*/protected void shareBji(View view){Bitmap bitmap= Bitmap.createBitmap(zhunron.getWidth(), zhunron.getHeight(), Bitmap.Config.ARGB_8888);Canvas c = new Canvas(bitmap);//防止生成透明图c.drawColor(Color.WHITE);zhunron.draw(c);//弹窗视图View popview= getLayoutInflater().inflate(R.layout.popuwindow,null,false);PopupWindow popupWindow=new PopupWindow(popview, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);// 设置外部区域可以点击取消popupWindowpopupWindow.setOutsideTouchable(true);//设置焦点,以便按返回键先退出浮窗popupWindow.setFocusable(true);
//        设置可触摸popupWindow.setTouchable(true);
//        设置动画高度popupWindow.setElevation(100);Button tpfs=popview.findViewById(R.id.bn_tpfs_pop),wzfx=popview.findViewById(R.id.bn_wbfs_pop);//保存图片或者复制文本监听tpfs.setOnClickListener(v->{SaveImage(bitmap);popupWindow.dismiss();});wzfx.setOnClickListener(v->{copyText(noteInfo);popupWindow.dismiss();});ImageView fxdtp=popview.findViewById(R.id.iv_tpzs_pop);fxdtp.setImageBitmap(bitmap);popupWindow.showAsDropDown(view,0,100,Gravity.BOTTOM);}/**设置背景图*/private void shezhiBijibjtp(){Log.d(TAG, "shezhiBijibjtp: "+noteInfo.bjbjtlj);if (noteInfo.bjbjtlj==null||noteInfo.bjbjtlj.equals("")){return;}new Thread(()->{Log.d(TAG, "shezhiBijibjtp: "+noteInfo.bjbjtlj);drawable=BitmapDrawable.createFromPath(noteInfo.bjbjtlj);handler.sendEmptyMessage(13);}).start();}Drawable drawable;int yszsfgg=-16777216;private void shezhiwenbys(){
//用的颜色选择器库依赖    implementation 'com.github.duanhong169:colorpicker:1.1.6'/*AlertDialog.Builder builder=new AlertDialog.Builder(this);builder.setTitle("字体颜色输入#ffffffff,前两位不透明度,后六位对应rgb值,或者颜色英文名");EditText yssr=new EditText(this);//设置条件yssr.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)});yssr.setText(noteInfo.bjnrys);builder.setView(yssr);builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {try {String valu=yssr.getText().toString();noteInfo.bjnrys=valu;et_bjbt.setTextColor(Color.parseColor(valu));bj_bjnr.setTextColor(Color.parseColor(valu));dialog.dismiss();}catch (Exception e){UtilToast.showShortT(Acty_Notebiji.this,"请按规范输入颜色值");return;}}});builder.setNegativeButton("取消",null);AlertDialog dialog = builder.create();dialog.show();*/new ColorPickerPopup.Builder(this).initialColor(noteInfo.bjnrys).enableAlpha(true).okTitle("确认").cancelTitle("取消").showValue(true).build().show(new ColorPickerPopup.ColorPickerObserver() {@Overridepublic void onColorPicked(int color) {Log.d(TAG, "colorChanged: "+color);noteInfo.bjnrys= color;bj_bjnr.setTextColor(color);et_bjbt.setTextColor(color);}});}public static final int qingqiuxiePrim=123;public void SaveImage(Bitmap bitmap){//保存图片new Thread(()->{Uri bcuri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new ContentValues());if (TextUtils.isEmpty(bcuri.toString())){handler.sendEmptyMessage(11);return ;}try {OutputStream outputStream=getContentResolver().openOutputStream(bcuri);if (bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream)){handler.sendEmptyMessage(12);}else {handler.sendEmptyMessage(11);}} catch (FileNotFoundException e) {e.printStackTrace();}}).start();}Handler handler=new Handler(Looper.getMainLooper(), new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {switch (msg.what){case 12:UtilToast.showShortT(Acty_Notebiji.this,"保存成功");break;case 11:UtilToast.showShortT(Acty_Notebiji.this,"保存失败");case 13:zhunron.setBackground(drawable);}return true;}});/*** 实现文本复制功能** @param noteInfo 复制的笔记* */public void copyText(NoteInfo noteInfo) {if (!TextUtils.isEmpty(noteInfo.neir)) {// 得到剪贴板管理器ClipboardManager cmb = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);// 创建一个剪贴数据集,包含一个普通文本数据条目(需要复制的数据)ClipData clipData = ClipData.newPlainText("笔记分享", noteInfo.toString());// 把数据集设置(复制)到剪贴板cmb.setPrimaryClip(clipData);// Only show a toast for Android 12 and lower.if (Build.VERSION.SDK_INT <= 32){UtilToast.showShortT(this,"笔记复制成功");}}}private static final String TAG = "1Acty_Notebiji";@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull  int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode){case qingqiuxiePrim:if (grantResults[0]!= PackageManager.PERMISSION_GRANTED)UtilToast.showShortT(this,"无权限,将无法保存图片,修改背景等,建议去设置中开启该应用的权限");break;}}@Overrideprotected void onDestroy() {super.onDestroy();String bijinr = bj_bjnr.getText().toString();String bjibt = et_bjbt.getText().toString();//如果选了取消或者为空就返回if (bjibt.equals("")||sfqx) return;noteInfo.nrztdx= (int) dqnrzh;noteInfo.biaot = bjibt;noteInfo.neir = bijinr;noteInfo.gxsj=UtilDateTime.getNow();//有就不重复添加,就更新if (position < 0) {Log.d(TAG, "onPause:通知添加成功" + bjibt);UtilToast.showShortT(this,"创建成功");ContentValues contentValues=new ContentValues();contentValues.put("bjtitle",bjibt);contentValues.put("bjneiron",bijinr);contentValues.put("bjcjsj",UtilDateTime.formatter.format(noteInfo.cjsj));contentValues.put("bjgxsj",UtilDateTime.formatter.format(noteInfo.gxsj));contentValues.put("zyxdj",noteInfo.zyx);contentValues.put("bjbjt",noteInfo.bjbjtlj);contentValues.put("bjnrys",noteInfo.bjnrys);contentValues.put("nrztdx",noteInfo.nrztdx);noteInfo.sqlid=SqlOphelper.getInstance(this).getWriteDb().insert(SqlOphelper.YHBJb,"",contentValues);Log.d(TAG, "onPause: "+noteInfo.sqlid);Frm_Note.frm_note.cjwc(noteInfo);} else {//一样就不更新if ((bjibt+bijinr).equals(bijicontent)) {if (noteInfo.bjbjtlj==null||noteInfo.bjbjtlj.equals(bjpath)){if (yszsfgg==noteInfo.bjnrys){Log.d(TAG, "onPause: 没有更新");return;}}}Log.d(TAG, "onPause: 笔记修改成功");//更新数据库SqlOphelper.getInstance(this).getWriteDb().execSQL(SqlOphelper.updatebjjl,new Object[]{bjibt, bijinr,UtilDateTime.formatter.format(noteInfo.gxsj),noteInfo.bjbjtlj,noteInfo.bjnrys,noteInfo.nrztdx, noteInfo.sqlid});//更新列表数据Frm_Note.frm_note.adapterNote.notifyItemChanged(position);Log.d(TAG, "onDestroy: 列表数据更新了");}Log.e(TAG, "onDestroy: bt"+bjibt+bijinr);}public static final int qingqiubjtp=1;/**更改背景调用,跳转到图片选择页面*/protected void znrbjgg(){Intent tpxz=new Intent(Intent.ACTION_PICK);tpxz.setType("image/*");startActivityForResult(tpxz,qingqiubjtp);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);//请求图片成功if (requestCode==qingqiubjtp&&data!=null){Uri selectedImage = data.getData();//返回的是uriString [] filePathColumn ={MediaStore.Images.Media.DATA} ;Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);cursor.moveToFirst();int columnIndex = cursor.getColumnIndex(filePathColumn[0]);//背景图路径noteInfo.bjbjtlj = cursor.getString(columnIndex);shezhiBijibjtp();Log.d(TAG, "onActivityResult:图片链接 "+noteInfo.bjbjtlj);UtilToast.showShortT(this,"图片获取成功");cursor.close();}else{UtilToast.showShortT(this,"图片获取失败"+data);Log.d(TAG, "onActivityResult: "+data);}}@Overridepublic boolean onCreatePanelMenu(int featureId, Menu menu) {getMenuInflater().inflate(R.menu.bjgncd,menu);return true;}float dqnrzh;float dqbtzh;@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {switch (item.getItemId()){//更改背景图片case R.id.bjbj_item:znrbjgg();break;case R.id.bjztys_item:shezhiwenbys();break;//字号增大减小case R.id.zdzh_item:et_bjbt.setTextSize(dqbtzh+=5);bj_bjnr.setTextSize(dqnrzh+=5);UtilToast.showShortT(this,"当前标题字号"+dqbtzh+"当前内容字号"+dqnrzh);break;case R.id.jxzh_item:UtilToast.showShortT(this,"当前标题字号"+dqbtzh+"当前内容字号"+dqnrzh);et_bjbt.setTextSize(dqbtzh-=5);bj_bjnr.setTextSize(dqnrzh-=5);break;case R.id.qxtjbj_item:sfqx=true;finish();break;case R.id.scbj_item:shanchubiji();break;}return true;}boolean sfqx=false;/*** 删除笔记*/private void shanchubiji(){AlertDialog.Builder builder=new AlertDialog.Builder(this);builder.setTitle("删除笔记提醒").setIcon(R.drawable.senbjlogo).setMessage("确认删除吗?").setPositiveButton("确认", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {SqlOphelper.getInstance(Acty_Notebiji.this).getWriteDb().delete(SqlOphelper.YHBJb,"id=?",new String[]{String.valueOf(noteInfo.sqlid)});Frm_Note.frm_note.datas.remove(noteInfo);Frm_Note.frm_note.adapterNote.notifyDataSetChanged();finish();}});builder.setNegativeButton("取消",null);//显示确认框builder.create().show();}public static void StartThis(Context context, int positon){Intent intent=new Intent(context,Acty_Notebiji.class);intent.putExtra("index",positon);context.startActivity(intent);}
}

主活动 用来显示两个碎片

package abc.szj.myapps;import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager.widget.ViewPager;import java.util.ArrayList;import abc.szj.myapps.others.UtilToast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar=findViewById(R.id.main_topbar_Tb);toolbar.setTitle("森笔记");setSupportActionBar(toolbar);initview();}private static final String TAG = "1MainActivity";private void initview(){RadioGroup navgroup=findViewById(R.id.navzu_main_RG);RadioButton tonzhi= (RadioButton) navgroup.getChildAt(0);RadioButton biji= (RadioButton) navgroup.getChildAt(1);ViewPager viewPager=findViewById(R.id.main_showFragm_vp);ArrayList<Fragment> fragments=new ArrayList<>(2);fragments.add(Frm_Notifa.frm_notifa);fragments.add(Frm_Note.frm_note);viewPager.setAdapter(new AdapterFragmentPager(getSupportFragmentManager(),fragments));viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {switch (position){case 0:tonzhi.setChecked(true);break;case 1:biji.setChecked(true);break;}}@Overridepublic void onPageScrollStateChanged(int state) {}});tonzhi.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if (isChecked){viewPager.setCurrentItem(0);}else {viewPager.setCurrentItem(1);}}});}@Overridepublic boolean onCreatePanelMenu(int featureId, Menu menu) {getMenuInflater().inflate(R.menu.mainmenu,menu);return true;}@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {switch (item.getItemId()){case R.id.shiyonjc_main:ActyShiyongjc.startThis(this);break;case R.id.qita_main:UtilToast.showShortT(this,"敬请期待!");}return super.onOptionsItemSelected(item);}
}

主活动布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><androidx.appcompat.widget.Toolbarandroid:id="@+id/main_topbar_Tb"android:layout_width="match_parent"app:titleTextColor="@color/blue_200"android:textAlignment="center"android:layout_height="39dp"/><androidx.viewpager.widget.ViewPagerandroid:layout_weight="1"android:id="@+id/main_showFragm_vp"android:layout_width="match_parent"android:layout_height="0dp"/><RadioGroupandroid:id="@+id/navzu_main_RG"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><RadioButtonandroid:paddingTop="6dp"android:gravity="center"android:button="@null"android:layout_weight="1"android:id="@+id/tonz_main_RB"android:layout_width="0dp"android:text="通知"android:drawableTop="@drawable/notification"android:background="@drawable/navbar"android:checked="true"android:paddingBottom="6dp"android:layout_height="wrap_content"/><RadioButtonandroid:paddingTop="6dp"android:layout_weight="1"android:id="@+id/biji_main_RB"android:layout_width="0dp"android:text="笔记"android:drawableTop="@drawable/ic_baseline_event_note_24"android:background="@drawable/navbar"android:gravity="center"android:layout_height="wrap_content"android:button="@null"android:paddingBottom="6dp" /></RadioGroup>
</LinearLayout>

森笔记app软件 开发记录相关推荐

  1. 物流管理APP软件开发公司 让货运变得更简单

    随着互联网技术的发展,人们的生活方式也发生了很大的变化,移动互联网如今已经深入到生活的方方面面,就连物流运输行业也开始涌现出各种货运物流管理APP软件,让整个物流管理过程更加简单.下面我们一起来看一下 ...

  2. 农村电商APP软件开发 电商新农村紧跟时代脚步

    互联网技术的深入发展让电子商务走向了高潮,不过在一些交通闭塞的乡村地区,电商发展还处于初期阶段.大量农产品从生产到流通渠道的变革,让互联网+农产品成为新型农业发展的重要手段,不仅增加了农业产值提高了农 ...

  3. 考试题库app软件开发

    文章标签:考试app开发.题库app开发定制.空调app制作,智能空调app开发功能. 考试题库app软件开发简直是互联网带给大家的福利,通过使用app,大家再也不用购买厚厚的练习册和书籍了,刷题直接 ...

  4. 软件开发有哪些规范和标准_深圳APP软件开发的流程是什么?

    深圳APP软件开发的流程是什么?APP软件开发是根据用户需求构建软件系统或设备的软件部分的过程,是一项系统工程,包括需求捕获,需求分析,系统设计,系统实现和系统测试.APP软件通常以某种编程语言实现, ...

  5. 安卓手机软件开发_无代码手机app软件开发,让人人都是专业开发工程师

    点击上方蓝色字关注我们~ 近期,谷歌发布了自己的无代码在线app开发平台,这款全新工具旨在让任何一个人都可以轻松进行手机app软件开发.这样的动作无疑指引着安卓软件开发的未来.

  6. vc6开发一个抓包软件_开发一个软件要多少钱?app软件开发的费用

    很多人咨询app开发相关的问题,大多数人最关心的就是:开发一个软件要多少钱?在本文中,我们将为大家分析这个经典问题:app软件开发的费用是多少? 对于行业中的任何人来说,这都是一个棘手的问题,即使你已 ...

  7. 服装电商APP软件开发平台作用

    服装电商APP开发,服装电商软件开发,服装电商APP开发平台,服装电商软件开发作用.服装产品的存有,让用户可以按照自己的喜爱开展变装小说,与此同时,因为网上购物方法的时兴,服装电商APP软件开发也应时 ...

  8. app软件开发现状及前景

    浅谈互联网行业: app软件开发现状及前景 随着市场对app需求增加,市场上开始涌现出大量的app软件开发定制厂商,各家公司根据自己发展需求定制适合自己发展的APP,那么国内APP软件开发现状究竟如何 ...

  9. 家电售后APP软件开发作用特点

    家电售后APP开发,家电售后APP开发作用,家电售后软件开发特点.购买家电是许多家里的一种要求,对于此事,为了更好地能够更好地确保用户针对选购该类产品的体验感,家电售后APP软件开发也渐渐兴起,依靠平 ...

最新文章

  1. find排除文件 linux_Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键...
  2. yii2-datepicker/datetimepicker插件使用
  3. STM32之CAN总线例程
  4. 据说,上海AI产业规模700亿,包揽全国1/3人才
  5. jfreechart 多参数传递
  6. UNIX环境高级编程——创建与打开IPC通道
  7. 【AAA】AAA协议介绍
  8. Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件
  9. 空间计量模型_5种经典空间计量模型的回归命令、程序及原始数据:SAR模型、SDM模型、SAC模型、SEM模型及GSPRE模型...
  10. netty 异常 did not read anything but decoded a message
  11. 前端毕业设计:Nodejs+Vue菜鸟驿站仓库管理系统的设计与实现
  12. 第一遍C++Primer5th读完感
  13. xshell修改服务器登录密码
  14. 什么是RFID? 射频识别技术的特点及工作原理!
  15. 我的世界java版旁观模式_我的世界:8个被判定为bug的特性,旁观模式:这锅让我来背...
  16. 基于gmssl SM2 签名验签测试程序
  17. SOC设计之AMBA总线-AHB总线详解
  18. GNS3路由器host not reachable问题解决方案
  19. ShareSDK 安装教程
  20. 广播模块加继电器怎么接线_智能继电器模块如何接线?

热门文章

  1. 非线性方程求解 :二分迭代法和牛顿迭代法
  2. 【调剂】浙江大学计算机学院机械专业2023年硕士研究生招生调剂通知
  3. 登录微信支付商户平台-产品中心,开通企业付款的方法
  4. C#MDI窗体实现多窗口效果
  5. MySQL备份和恢复:mysqldump工具用法详述
  6. 苹果电脑python怎么安装request_python怎么装request
  7. 成都计算机系统维护专业中专,成都计算机应用专业中专招生简章
  8. 计算机组装前工具的准备,计算机组装 必备工具
  9. teamviewer注册版和免费版有什么区别_TeamViewer最终年度版本有什么不同?
  10. PM - 软件版本命名规范及各阶段说明