-
安卓记事本
2015-07-21 16:23:11安卓记事本,用sqllite存储事件,安卓4.0以上虚拟机 -
安卓记事本程序源码
2021-03-16 13:02:21安卓记事本程序源码是一个适合新手学习的安卓记事本程序例子源码,包括很多安卓基础的知识,并且代码有比较详细的注释,主要用到了listView展示数据和SQLite的读写建表等操作。代码量很少没有分层布局也相对简单方便... -
安卓记事本实例
2017-02-19 15:03:02简单安卓记事本实例,适合刚入门不久的新手学习,增加开发实践 -
安卓记事本闹铃提醒
2014-03-26 00:52:09安卓记事本实现闹铃提醒等功能,需要安卓SDK为android-18,导入eclipse便可运行成功。 -
安卓记事本程序例子源码
2017-01-02 12:59:48安卓记事本程序例子源码主要用到了listView展示数据和SQLite的读写建表等操作。代码量很少没有分层布局也相对简单方便学习分析 -
基于Andriod平台的安卓记事本程序源码
2015-06-26 19:43:28安卓记事本程序源码是一个适合新手学习的安卓记事本程序例子源码,包括很多安卓基础的知识,并且代码有比较详细的注释,主要用到了listView展示数据和SQLite的读写建表等操作。代码量很少没有分层布局也相对简单方便... -
2个安卓记事本源码+开机动画以及密码设置文档
2016-06-17 09:37:18简单的两个安卓记事本案例,附加开机动画和密码设置教程文案。 -
安卓简单记事本源码_好用的安卓记事本备忘录便签app推荐
2021-01-11 19:29:03安卓系统的手机是很多上班族都在使用的手机设备,安卓系统下有多个不同的手机品牌,这些不同品牌之间,设备自带的便签备忘录软件并不相互同步,那么安卓系统的手机上有没有一款记事本备忘录便签app,能够实现在多个...安卓系统的手机是很多上班族都在使用的手机设备,安卓系统下有多个不同的手机品牌,这些不同品牌之间,设备自带的便签备忘录软件并不相互同步,那么安卓系统的手机上有没有一款记事本备忘录便签app,能够实现在多个不同品牌的安卓系统的手机上同步使用呢?
这篇文章的主要内容,小编就跟大家分享一个安卓手机上好用的记事本备忘录便签app,为大家介绍下商务办公云便签敬业签都有哪些简单又好用的便签备忘功能。
敬业签是专为上班族设计的桌面便签记事备忘软件,支持安卓系统的手机(以及苹果手机、iPad设备、Windows电脑和Mac电脑),在手机的应用市场中即可免费安装使用,它上面的实用功能有:
1.云记事,便签中记录保存成功的内容是自动云储存的,卸载程序也不会造成记事内容的丢失,重新安装程序登录便签账号,即可恢复便签中记录的内容。
2.云备份,系统在自动云储存内容的同时,也会同步在时间轴上生成日志备份记录,当删除或是修改某条便签记事备忘内容时,想要找回之前的内容,可查阅时间轴上的备份记录进行找回。
3.标记记事备忘内容已经完成,把待办的事情写到便签中时,可在事情办完之后,标记相应计划事项已经标记,方便区分完成与未完成事项,做好待办事项时间管理。
想要了解更多关于敬业签商务办公备忘录便签记事本的功能介绍与使用详情,欢迎访问官方网站(https://www.jingyeqian.com/)进行了解。
-
安卓记事本小项目
2014-12-22 15:25:32安卓小项目-记事本,适用于学生期末项目提交以及个人代码练习。注:代码简单,只适用于学生 -
Android代码-安卓记事本app
2019-08-06 04:02:19安卓app,记事本,写下要做什么,已经做完了什么。 功能: 显示要做的记事列表; 新增一条记事; 删除、修改记事; 标志记事完成; 显示已经完成的记事列表; 将已经完成的记事列表进行重做; 下一步计划: 增加... -
NotePad安卓记事本
2020-07-02 09:38:03mid-term期中作业题目:1.添加时间戳2.添加搜索功能3.修改背景颜色4.导出文件5.设置闹钟功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表...期中作业
题目:
基于Notepad的优化
1.添加时间戳
核心代码:
添加一个显示时间的TextView<TextView android:id="@+id/text1_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:paddingLeft="5dip" android:textColor="@color/colorBlack"/>
在NotePadProvider.java中添加显示时间的字段,在NoteList.java的PROJECTION中定义显示的时间,在dataColumns,viewIDs中补充时间部分:
private static final String[] PROJECTION = new String[] { NotePad.Notes._ID, // 0 NotePad.Notes.COLUMN_NAME_TITLE, // 1 //扩展 显示时间 NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, };
String[] dataColumns = { NotePad.Notes.COLUMN_NAME_TITLE , NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE } ; int[] viewIDs = { android.R.id.text1 , R.id.text1_time };
把时间戳改为以时间格式存入,改动地方分别为NotePadProvider中的insert方法和NoteEditor中的updateNote方法:
Long now = Long.valueOf(System.currentTimeMillis()); Date date = new Date(now); SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); String dateTime = format.format(date);
2.添加搜索功能
核心代码:
在list_options_menu.xml中添加一个搜索的item<item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@android:drawable/ic_search_category_default" android:showAsAction="always"> </item>
在NoteList中找到onOptionsItemSelected方法,在switch中添加搜索的case语句:
//添加搜素 case R.id.menu_search: Intent intent = new Intent(); intent.setClass(NotesList.this,NoteSearch.class); NotesList.this.startActivity(intent); return true;
在layout中新建布局文件note_search_list.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <SearchView android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:iconifiedByDefault="false" android:queryHint="输入搜索内容..." android:layout_alignParentTop="true"> </SearchView> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
创建NoteSearch.java,继承ListView,实现SearchView.OnQueryTextListener接口:
public class NoteSearch extends ListActivity implements SearchView.OnQueryTextListener { private static final String[] PROJECTION = new String[] { NotePad.Notes._ID, // 0 NotePad.Notes.COLUMN_NAME_TITLE, // 1 //扩展 显示时间 NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 2 }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.note_search_list); Intent intent = getIntent(); if (intent.getData() == null) { intent.setData(NotePad.Notes.CONTENT_URI); } SearchView searchview = (SearchView)findViewById(R.id.search_view); //为查询文本框注册监听器 searchview.setOnQueryTextListener(NoteSearch.this); } @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { String selection = NotePad.Notes.COLUMN_NAME_TITLE + " Like ? "; String[] selectionArgs = { "%"+newText+"%" }; Cursor cursor = managedQuery( getIntent().getData(), PROJECTION, selection, selectionArgs, NotePad.Notes.DEFAULT_SORT_ORDER ); String[] dataColumns = { NotePad.Notes.COLUMN_NAME_TITLE , NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE }; int[] viewIDs = { android.R.id.text1 , R.id.text1_time }; MyCursorAdapter adapter = new MyCursorAdapter( this, R.layout.noteslist_item, cursor, dataColumns, viewIDs ); setListAdapter(adapter); return true; } @Override protected void onListItemClick(ListView l, View v, int position, long id) { Uri uri = ContentUris.withAppendedId(getIntent().getData(), id); String action = getIntent().getAction(); if (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)) { setResult(RESULT_OK, new Intent().setData(uri)); } else { startActivity(new Intent(Intent.ACTION_EDIT, uri)); } } }
AndroidManifest.xml注册NoteSearch:
<activity android:name="NoteSearch" android:label="@string/title_notes_search"> </activity>
运行截图:
3.修改背景颜色
核心代码:
添加背景颜色字段,和时间戳类似不再重复描述,在系统中预定于好五种颜色,根据颜色对应不int值选择要显示的颜色,契约类中的定义:public static final int DEFAULT_COLOR = 0; //白 public static final int YELLOW_COLOR = 1; //黄 public static final int BLUE_COLOR = 2; //蓝 public static final int GREEN_COLOR = 3; //绿 public static final int RED_COLOR = 4; //红
NotePadProvider中的insert:
// 新建笔记,背景默认为白色 if (values.containsKey(NotePad.Notes.COLUMN_NAME_BACK_COLOR) == false) { values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, NotePad.Notes.DEFAULT_COLOR); }
自定义一个CursorAdapter继承SimpleCursorAdapter,既能完成cursor读取的数据库内容填充到item,又能将颜色填充,并将NoteList中用的SimpleCursorAdapter改使用MyCursorAdapter:
public class MyCursorAdapter extends SimpleCursorAdapter { public MyCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { super(context, layout, c, from, to); } @Override public void bindView(View view, Context context, Cursor cursor){ super.bindView(view, context, cursor); //从数据库中读取的cursor中获取笔记列表对应的颜色数据,并设置笔记颜色 int x = cursor.getInt(cursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_BACK_COLOR)); switch (x){ case NotePad.Notes.DEFAULT_COLOR: view.setBackgroundColor(Color.rgb(255, 255, 255)); break; case NotePad.Notes.YELLOW_COLOR: view.setBackgroundColor(Color.rgb(247, 216, 133)); break; case NotePad.Notes.BLUE_COLOR: view.setBackgroundColor(Color.rgb(165, 202, 237)); break; case NotePad.Notes.GREEN_COLOR: view.setBackgroundColor(Color.rgb(161, 214, 174)); break; case NotePad.Notes.RED_COLOR: view.setBackgroundColor(Color.rgb(244, 149, 133)); break; default: view.setBackgroundColor(Color.rgb(255, 255, 255)); break; } } }
editor_options_menu.xml添加修改背景颜色选项,并且在NoteEditor中的onOptionsItemSelected()方法的switch中添加选项:
case R.id.menu_color: changeColor(); break; //跳转改变颜色的activity,将uri信息传到新的activity private final void changeColor() { Intent intent = new Intent(null,mUri); intent.setClass(NoteEditor.this,NoteColor.class); NoteEditor.this.startActivity(intent); }
创建note_color.xml,NoteColor的Acitvity,用来选择颜色。在AndroidManifest.xml中将这个Acitvity主题定义为对话框样式:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageButton android:id="@+id/color_white" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="@color/colorWhite" android:onClick="white"/> <ImageButton android:id="@+id/color_yellow" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="@color/colorYellow" android:onClick="yellow"/> <ImageButton android:id="@+id/color_blue" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="@color/colorBlue" android:onClick="blue"/> <ImageButton android:id="@+id/color_green" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="@color/colorGreen" android:onClick="green"/> <ImageButton android:id="@+id/color_red" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="@color/colorRed" android:onClick="red"/> </LinearLayout> public class NoteColor extends Activity { private Cursor mCursor; private Uri mUri; private int color; private static final int COLUMN_INDEX_TITLE = 1; private static final String[] PROJECTION = new String[] { NotePad.Notes._ID, // 0 NotePad.Notes.COLUMN_NAME_BACK_COLOR, }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.note_color); //从NoteEditor传入的uri mUri = getIntent().getData(); mCursor = managedQuery( mUri, // The URI for the note that is to be retrieved. PROJECTION, // The columns to retrieve null, // No selection criteria are used, so no where columns are needed. null, // No where columns are used, so no where values are needed. null // No sort order is needed. ); } @Override protected void onResume(){ //执行顺序在onCreate之后 if (mCursor != null) { mCursor.moveToFirst(); color = mCursor.getInt(COLUMN_INDEX_TITLE); } super.onResume(); } @Override protected void onPause() { //执行顺序在finish()之后,将选择的颜色存入数据库 super.onPause(); ContentValues values = new ContentValues(); values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, color); getContentResolver().update(mUri, values, null, null); } public void white(View view){ color = NotePad.Notes.DEFAULT_COLOR; finish(); } public void yellow(View view){ color = NotePad.Notes.YELLOW_COLOR; finish(); } public void blue(View view){ color = NotePad.Notes.BLUE_COLOR; finish(); } public void green(View view){ color = NotePad.Notes.GREEN_COLOR; finish(); } public void red(View view){ color = NotePad.Notes.RED_COLOR; finish(); } } <activity android:name="NoteColor" android:theme="@android:style/Theme.Holo.Light.Dialog" android:label="ChangeColor" android:windowSoftInputMode="stateVisible"/>
运行截图:
4.导出文件
核心代码:
在editor_options_menu.xml添加一个导出笔记的选项;在NoteEditor中找到onOptionsItemSelected()方法并在菜单的switch中添加方法;
新建布局output_text.xml:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:paddingLeft="6dip" android:paddingRight="6dip" android:paddingBottom="3dip"> <EditText android:id="@+id/output_name" android:maxLines="1" android:layout_marginTop="2dp" android:layout_marginBottom="15dp" android:layout_width="wrap_content" android:ems="25" android:layout_height="wrap_content" android:autoText="true" android:capitalize="sentences" android:scrollHorizontally="true" /> <Button android:id="@+id/output_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="@string/output_ok" android:onClick="OutputOk" /> </LinearLayout>
创建Output.java:
public class OutputText extends Activity { //要使用的数据库中笔记的信息 private static final String[] PROJECTION = new String[] { NotePad.Notes._ID, // 0 NotePad.Notes.COLUMN_NAME_TITLE, // 1 NotePad.Notes.COLUMN_NAME_NOTE, // 2 NotePad.Notes.COLUMN_NAME_CREATE_DATE, // 3 NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 4 }; //读取出的值放入这些变量 private String TITLE; private String NOTE; private String CREATE_DATE; private String MODIFICATION_DATE; //读取该笔记信息 private Cursor mCursor; //导出文件的名字 private EditText mName; //NoteEditor传入的uri,用于从数据库查出该笔记 private Uri mUri; //关于返回与保存按钮的一个特殊标记,返回的话不执行导出,点击按钮才导出 private boolean flag = false; private static final int COLUMN_INDEX_TITLE = 1; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.output_text); mUri = getIntent().getData(); mCursor = managedQuery( mUri, // The URI for the note that is to be retrieved. PROJECTION, // The columns to retrieve null, // No selection criteria are used, so no where columns are needed. null, // No where columns are used, so no where values are needed. null // No sort order is needed. ); mName = (EditText) findViewById(R.id.output_name); } @Override protected void onResume(){ super.onResume(); if (mCursor != null) { // The Cursor was just retrieved, so its index is set to one record *before* the first // record retrieved. This moves it to the first record. mCursor.moveToFirst(); //编辑框默认的文件名为标题,可自行更改 mName.setText(mCursor.getString(COLUMN_INDEX_TITLE)); } } @Override protected void onPause() { super.onPause(); if (mCursor != null) { //从mCursor读取对应值 TITLE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_TITLE)); NOTE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_NOTE)); CREATE_DATE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_CREATE_DATE)); MODIFICATION_DATE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE)); //flag在点击导出按钮时会设置为true,执行写文件 if (flag == true) { write(); } flag = false; } } public void OutputOk(View v){ flag = true; finish(); } private void write() { try { // 如果手机插入了SD卡,而且应用程序具有访问SD的权限 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 获取SD卡的目录 File sdCardDir = Environment.getExternalStorageDirectory(); //创建文件目录 File targetFile = new File(sdCardDir.getCanonicalPath() + "/" + mName.getText() + ".txt"); //写文件 PrintWriter ps = new PrintWriter(new OutputStreamWriter(new FileOutputStream(targetFile), "UTF-8")); ps.println(TITLE); ps.println(NOTE); ps.println("创建时间:" + CREATE_DATE); ps.println("最后一次修改时间:" + MODIFICATION_DATE); ps.close(); Toast.makeText(this, "保存成功,保存位置:" + sdCardDir.getCanonicalPath() + "/" + mName.getText() + ".txt", Toast.LENGTH_LONG).show(); } } catch (Exception e) { e.printStackTrace(); } } }
在NoteList中添加权限方法,并在Oncreate方法中调用:
public void getPermission(){ if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {//这里可以写个对话框之类的项向用户解释为什么要申请权限,并在对话框的确认键后续再次申请权限 } else { //申请权限,字符串数组内是一个或多个要申请的权限,1是申请权限结果的返回参数,在onRequestPermissionsResult可以得知申请结果 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,}, 1); } } }
在AndroidManifest.xml中将这个Acitvity主题定义为对话框样式,并且加入权限:
<activity android:name="OutputText" android:label="@string/output_name" android:theme="@android:style/Theme.Holo.Dialog" android:windowSoftInputMode="stateVisible"> </activity>
<!-- 在SD卡中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions,WrongManifestParent" /> <!-- 向SD卡写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="WrongManifestParent" />
运行截图:
5.设置闹钟
核心代码:
在NoteEditor.java中添加控件,在NoteEditor.java中的OptionMenu中添加相应的选项,和选择事件的触发,以及在数据库中添加字段
创建DatePickerDialog和TimePickerDialog来进行时间与日期的选择private void createDateDialog(){ final Calendar calendar=Calendar.getInstance(); DatePickerDialog dialog = new DatePickerDialog(this, AlertDialog.THEME_HOLO_DARK, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { String date=year+"-"+(month+1)+"-"+dayOfMonth; if(time!=null){ dateButton.setText(date); }else{ String text=calendar.get(Calendar.HOUR_OF_DAY)+":"+(calendar.get(Calendar.MINUTE)+5); time=" "+text;//如果时间未指定,则默认为当前时间的5分钟后提醒 dateButton.setText(year+"-"+(month+1)+"-"+dayOfMonth+" "+text); } dateButton.setVisibility(View.VISIBLE); } }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); dialog.getDatePicker().setMinDate(System.currentTimeMillis()-1000);//选择以当前时间开始,避免无效时间的选择 dialog.setTitle("日期:"); dialog.show(); }
private void createTimeDialog(){ final Calendar calendar=Calendar.getInstance(); TimePickerDialog dialog=new TimePickerDialog(this, AlertDialog.THEME_HOLO_DARK,new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { String text=calendar.get(Calendar.YEAR)+"-"+(calendar.get(Calendar.MONTH)+1)+"-"+calendar.get(Calendar.DAY_OF_MONTH); /* * 判断时间的选择是否为无效时间,在当前的时间之前 * */ if(text.equals(date)||date==null){ if(hourOfDay<=calendar.get(Calendar.HOUR_OF_DAY)) time=" "+calendar.get(Calendar.HOUR_OF_DAY)+":"+minute; else{ time=" "+hourOfDay+":"+minute; } }else{ time=" "+hourOfDay+":"+minute; } if(date!=null){ dateButton.setText(date+time); }else{ date=text; dateButton.setText(text+time); } dateButton.setVisibility(View.VISIBLE); } }, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), true); dialog.setTitle("时间:"); dialog.show(); }
保存笔记之后,将需要提醒的信息封装进PendingIntent,以广播的形式发送出去
private void notifyMessage(){ if(time!=null&&date!=null){ Log.d("222","22222time"+date+time); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm"); long t=System.currentTimeMillis()+1000; try { t=simpleDateFormat.parse(date+time).getTime(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } //是Intent跳转到指定的广播处理 Intent intent=new Intent(NoteEditor.this, RemindActionBroadcast.class); /* * 把文本的内容和标题存入Intent * */ intent.putExtra("title",mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_TITLE))); intent.putExtra("context",mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_NOTE))); //将requestCode设为每个文本的ID以实现能够发送不同的信息,不会被覆盖 PendingIntent pendingIntent= PendingIntent.getBroadcast(NoteEditor.this,mCursor.getInt(mCursor.getColumnIndex(NotePad.Notes._ID)),intent,PendingIntent.FLAG_UPDATE_CURRENT); Calendar calendar=Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND,(int)((t-System.currentTimeMillis())/1000)); //使用AlarmManager实现定时功能 AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent); } }
创建RemindActionBroadcast .java,在广播接受类中进行处理和通知:
public class RemindActionBroadcast extends BroadcastReceiver { public static int id=0; @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @Override public void onReceive(Context context, Intent intent) { PendingIntent pendingIntent=PendingIntent.getActivity(context,0,intent,0); NotificationManager notificationManager=(NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE); Notification.Builder mbuilder=new Notification.Builder(context); mbuilder.setContentTitle(intent.getStringExtra("title"));//设置通知栏标题 mbuilder.setContentText(intent.getStringExtra("context"));//设置通知栏内容 mbuilder.setSmallIcon(R.mipmap.ic_launcher);//设置小图标 mbuilder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher));//设置大图标 mbuilder.setContentIntent(pendingIntent);//设置点击跳转的Intent,因为没有设置uri,所以跳转为空 mbuilder.setAutoCancel(true);//点击之后消失 Notification notification=mbuilder.build(); notificationManager.notify(id++,notification);//能够传送多条消息 } }
运行截图:
3.使用XML定义菜单 :
核心代码:public class MenuActivity extends AppCompatActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main,menu); return true; } @Override protected void onCreate(Bundle savedInstanceState) { this.setTitle("XML定义菜单"); super.onCreate(savedInstanceState); setContentView(R.layout.menu_layout); } @Override public boolean onOptionsItemSelected(MenuItem item) { TextView textView =(TextView) findViewById(R.id.text); switch (item.getItemId()){ case R.id.z1: textView.setTextSize(10);break; case R.id.z2: textView.setTextSize(16);break; case R.id.z3: textView.setTextSize(20);break; case R.id.y1: textView.setTextColor(Color.RED);break; case R.id.y2: textView.setTextColor(Color.BLACK);break; case R.id.p: Toast.makeText(this,"这是普通单击项",Toast.LENGTH_SHORT).show(); break; default: } return true; } }
menu_layout.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/z" android:title="字体大小" > <menu> <group> <item android:id="@+id/z1" android:title="10号字体" /> <item android:id="@+id/z2" android:title="16号字体" /> <item android:id="@+id/z3" android:title="20号字体" /> </group> </menu> </item> <item android:id="@+id/p" android:title="普通菜单项" > </item> <item android:id="@+id/y" android:title="字体颜色"> <menu> <group> <item android:id="@+id/y1" android:title="红色" /> <item android:id="@+id/y2" android:title="黑色" /> </group> </menu> </item> </menu>
运行截图:
20号字体:
红色:
普通选项:
4.创建上下文操作模式(ActionMode)的上下文菜单
核心代码:public class ActionMode extends AppCompatActivity { private ListView listView; private List<Number> numberList = new ArrayList<>(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { this.setTitle("ActionMode"); super.onCreate(savedInstanceState); setContentView(R.layout.actionmode_layout); initNumber(); NumberAdapter adapter = new NumberAdapter(ActionMode.this,R.layout.number_layout,numberList); listView = (ListView) findViewById(R.id.list_view2); listView.setAdapter(adapter); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { @Override public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.actionmode, menu); return true; } @Override public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) { mode.finish(); return false; } @Override public void onDestroyActionMode(android.view.ActionMode mode) { } @Override public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) { mode.setTitle(listView.getCheckedItemCount()+" selected"); } }); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { } }); } private void initNumber(){ for(int i=0;i<2;i++){ Number one = new Number("One",R.mipmap.ic_launcher); numberList.add(one); Number two = new Number("Two",R.mipmap.ic_launcher); numberList.add(two); Number three = new Number("Three",R.mipmap.ic_launcher); numberList.add(three); Number four = new Number("four",R.mipmap.ic_launcher); numberList.add(four); Number five = new Number("five",R.mipmap.ic_launcher); numberList.add(five); } } }
NumberAdapter
public class NumberAdapter extends ArrayAdapter<Number> { private int resourceId; public NumberAdapter(@NonNull Context context, int resource, @NonNull List<Number> objects) { super(context, resource, objects); resourceId = resource; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { Number number = getItem(position); View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); ImageView numberImage=(ImageView)view.findViewById(R.id.num_image); TextView numberName=(TextView)view.findViewById(R.id.num_name); numberImage.setImageResource(number.getImageId()); numberName.setText(number.getName()); return view; } }
运行截图: