【Android 初学者】菜单和消息提醒
来源:互联网 发布:h5性能优化 编辑:程序博客网 时间:2024/05/04 17:22
未接的电话,未看的短信,
浏览器每天推送的广告条,
下载好的音乐 弹窗:文件下载完毕....
一系列等等,这些都是
菜单:
选项菜单
上下文菜单
子菜单
三个方法,创建菜单,修改菜单,处理菜单被选中所执行的操作
public booleanonCreateOptionsMenu(Menu m)
public booleanonPrepareOptionsMenu(Menu m)public booleanonOptionsItemSelected(MenuItem item)
例子效果如图:
简单通知一:短信会出现到界面提示框,但是不能点击查看
简单通知二:
可以看到信息,可以点进去查看,
因为xml中有标题,虚拟机中没有,于是在string 中 加了标题,结果.....
这里的标题有两个,等会儿手动去掉。
例子三:下载提示模拟
代码板块:一个是主方法:MainActivity ,一个是接收短信查看信息的方法:showNotificationActivity
看起来超简单啊
代码奉上:
一、消息提示:
1.1、MainActivity
package com.open_open.androidch09_2;import android.app.Activity;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Intent;import android.os.SystemClock;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //发送简单通知 public void testOne(View view){//构造通知管理器 NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);//构建一个通知的构造器 Notification.Builder builder=new Notification.Builder(this);//设置Builder的相关参数 Ticker 状态栏,smallIcon图片,ContentTitle 标题 ContentText 主体内容 Defaults 震动 builder.setTicker("您有新的通知栏");// 状态栏 builder.setSmallIcon(R.drawable.meizi);//状态栏图片 builder.setContentTitle("工作通知:");//设置主题内容标题 builder.setContentText("下午三点,来食堂准备工作!"); //主体内容 builder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); //设置消息默认提醒模式:亮灯 和 响铃 和 震动//----------------新增参数设置----------------///* PendingIntent:即将指定的命令;Intent:立即执行的命令 */ //自定义震动模式[非必须设定,延迟100毫秒后震动,再延迟200毫秒后震动...] builder.setVibrate(new long[]{100,200,100,300}); //发送通知 manager.notify(0,builder.build()); }//-----------发送简单通知二//发送简单通知二public void testTwo(View view){ //构建通知管理器 NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); //构建一个通知的构建器 Notification.Builder builder=new Notification.Builder(this); //设置builder相关参数 Ticker状态栏,SmallIcon 显示图片 ,ContentTitle 标题,ContentText 内容 builder.setTicker("您有新的消息:");//设置状态栏显示标题 builder.setSmallIcon(R.drawable.meizi);//状态栏显示小图标 builder.setContentTitle("最新工作消息:");//设置主体内容标题 builder.setContentText("你已被Oracle公司录用,请于明天8点到美国硅谷公司,面试!");//设置主体内容 builder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND);//设置消息默认提醒模式 //=======新增参数设置=======// builder.setAutoCancel(true);//已经查看的通知自动销毁 builder.setWhen(SystemClock.currentThreadTimeMillis());//设置什么时候发出通知 //设置点击通知后执行的动作 Intent intent=new Intent(this,showNotificationActivity.class); intent.putExtra("messageBody", "你已被Oracle公司录用,请于明天8点到美国硅谷公司,面试!"); PendingIntent pendingIntent = PendingIntent.getActivity(this,1,intent,PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(pendingIntent); //设置点击通知后执行的动作 //自定义提示音 //builder.setSound(Uri.parse("file:///sdcard/nobody.mp3")); //自定义振动模式[延迟100毫秒后振动200毫秒再延迟100毫秒后再次振动300毫秒] builder.setVibrate(new long[]{100,200,100,300}); //发送通知 manager.notify(1, builder.build());} //带有进度条的通知 NotificationManager manager; Notification.Builder builder;/*--------------案例三 -----------------------------*/ public void testThree(View view){ //构建通知管理器 manager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE); //构建一个通知的构建器 builder=new Notification.Builder(this); //设置builder相关参数 builder.setTicker("开始下载!");//设置状态栏显示标题 builder.setSmallIcon(R.drawable.meizi);//状态栏显示小图标 builder.setContentText("文件正在下载中......");//设置主体内容 //=======新增参数设置=======// builder.setAutoCancel(true); //已经查看的通知自动销毁 builder.setProgress(100,0,false); //开始下载 new Thread(new Runnable() { @Override public void run() { for (int i=1;i<=100;i++){ builder.setProgress(100,i,false); if (i==100) builder.setContentText("文件下载完毕!"); manager.notify(2,builder.build()); SystemClock.sleep(100); //模似下载 } manager.cancel(2); //撤销编号为2的通知 } }).start(); }}
一、消息提示:
1.2、 activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="简单通知一" android:textSize="30sp" android:gravity="center" android:onClick="testOne" android:layout_margin="5sp"/><Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="简单通知二" android:textSize="30sp" android:gravity="center" android:onClick="testTwo" android:layout_margin="5sp"/><Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="简单通知三" android:textSize="30sp" android:gravity="center" android:onClick="testThree" android:layout_margin="5sp"/></LinearLayout>
一、消息提示:
2.1、showNotificationActivity
package com.open_open.androidch09_2;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import org.w3c.dom.Text;public class showNotificationActivity extends AppCompatActivity { private TextView showText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);/* 若是页面有2个标题,这2行代码可以去掉一行标题 但是这两行必须写在这个位置。 getWindow().setType(getWindow().FEATURE_LEFT_ICON); this.requestWindowFeature(getWindow().FEATURE_NO_TITLE); */ setContentView(R.layout.activity_show_notification); showText=(TextView)findViewById(R.id.showMessage); Intent intent=getIntent(); String message=intent.getStringExtra("messageBody"); showText.setText(message); }}
一、消息提示:
2.2、activity_show_notification.xml
(是内容是空的,因为要接收短信 信息)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/showMessage" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="25sp" android:textColor="@color/colorPrimary"/></LinearLayout>
3、其他补充:
在 虚拟机上还是会显示标题的,但是有些 android5.0以上,可能会隐藏标题,
在values -style.xml 这里手动加上两行代码即可
别忘了还有一张图片哦。
--------------------------------------------------------------------------------------------------------------------------------------------------
二、菜单栏:
我们做apk的时候,界面比较小,功能多的时候,需要用菜单来管理
一般来说:标题栏有+ 号,或者文字可以点击显示菜单
主页:
菜单肯定有功能啊!
页面一:
长按促发事件:
新建文件,设置字体颜色
页面二:点击一个扩大镜图标,显示:搜索框搜索
下面带着输入的提示,
纠正提示还没有做,毕竟没有到数据库,
还不会自动筛选热门的词条
代码构成一览:
(比较复杂呢)
菜单栏代码奉上:
二、
1.1、主方法:MainActivity.java
package com.open_open.androidch09_newstishi;import java.lang.reflect.Method;import android.graphics.SumPathEffect;import com.open_open.androidch09_newstishi.com.example.util.MenuIconUtil;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.SubMenu;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity { private TextView showText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showText=(TextView)findViewById(R.id.showText); } //创建选项菜单 第一个0:第一个表单,1:排序,1:表单排列的顺序,0最前面 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuIconUtil.setIconEnable(menu,true);//修改系统参数,允许菜单图标显示 menu.add("文件").setIcon(R.drawable.meizi); menu.add(0,1,1,"新建").setIcon(R.drawable.meizi);//点击新建,弹出提示 menu.add(0,2,2,"打开").setIcon(R.drawable.meizi);//点击打开,打开TestOneActivity menu.add(0,4,2,"打开2").setIntent(new Intent(this,TestTwoActivity.class)).setIcon(R.drawable.meizi);//点击打开,打开TestOneActivity menu.add(0,3,0,"退出").setIcon(R.drawable.meizi);//点击退出,窗体退出 //新增一个子菜单menu.removeItem(id),可自定义字体大小 SubMenu myfont=menu.addSubMenu(0,5,5,"字体"); myfont.add(1, 5, 0, "15"); myfont.add(1, 6, 1, "20"); myfont.add(1, 7, 2, "25"); myfont.add(1, 8, 3, "30"); return super.onCreateOptionsMenu(menu); } //动态修改菜单 @Override public boolean onPrepareOptionsMenu(Menu menu) { //禁用新建菜单 menu.findItem(1).setEnabled(false); menu.getItem(0).setTitle("新文件"); //如果需要,可以清除所有菜单,全部重新创建 //menu.clear(); return super.onPrepareOptionsMenu(menu); } //处理菜单被选中后的操作 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 3: this.finish();//关闭窗体 break; case 1: Toast.makeText(this, "你选中了新建", 3000).show(); break; case 2: Intent intent=new Intent(this,TestOneActivity.class); startActivity(intent); break; case 5: showText.setTextSize(15); break; case 6: showText.setTextSize(20); break; case 7: showText.setTextSize(25); break; case 8: showText.setTextSize(30); break; default: break; } return super.onOptionsItemSelected(item); }}
二、
1.2、主方法页面:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/showText" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="这里是MainActivity" android:textSize="25sp" /></LinearLayout>
二、
2.1、页面一方法:
TestOneActivity.javapackage com.open_open.androidch09_newstishi;import android.app.ActionBar;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.open_open.androidch09_newstishi.com.example.util.MenuIconUtil;public class TestOneActivity extends Activity { private TextView showText; private ListView showCitys; private String selectedText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_one); showText=(TextView)findViewById(R.id.showText); showCitys=(ListView)findViewById(R.id.citys); //为名称为showCitys的ListView添加上下文菜单 registerForContextMenu(showCitys); //为ListView添加长按事件 showCitys.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { selectedText=getResources().getStringArray(R.array.citys)[position]; return false; } }); //ActionBar ActionBar actionBar=getActionBar(); if(actionBar!=null){ //启用回退按钮 actionBar.setDisplayHomeAsUpEnabled(true); //禁止窗体标题显示 actionBar.setDisplayShowTitleEnabled(false); } } //利用XML文件来生成选项菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { //通过投影形式将XML文件生成Menu MenuIconUtil.setIconEnable(menu,true);//修改系统参数,允许菜单图标显示 getMenuInflater().inflate(R.menu.test_one, menu); return super.onCreateOptionsMenu(menu); } //处理选项菜单选中事件 @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId()==android.R.id.home||item.getItemId()==R.id.exit){ this.finish(); }else if(item.getItemId()==R.id.cred){ showText.setTextColor(Color.RED); }else if(item.getItemId()==R.id.cgreen){ showText.setTextColor(Color.GREEN); } return super.onOptionsItemSelected(item); } //================上下文菜单==================// //创建上下文菜单 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { //引入上下文菜单 getMenuInflater().inflate(R.menu.listitem_contextmenu, menu); super.onCreateContextMenu(menu, v, menuInfo); } //处理上下文菜单事件 @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.listupdate: Toast.makeText(getApplicationContext(), "修改:"+selectedText, 3000).show(); break; case R.id.listdelete: Toast.makeText(getApplicationContext(), "删除:"+selectedText, 3000).show(); break; default: break; } return super.onContextItemSelected(item); }}
二、
2.2、页面一xml 布局文件:
activity_test_one.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/showText" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="25sp" android:text="这是TestOneActivity" /> <ListView android:id="@+id/citys" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/citys" /></LinearLayout>
二、
2.3、页面二 方法:
TestTwoActivity.javapackage com.open_open.androidch09_newstishi;import android.app.ActionBar;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnFocusChangeListener;import android.widget.SearchView;import android.widget.SearchView.OnQueryTextListener;import android.widget.TextView;public class TestTwoActivity extends Activity { private TextView showSearchText; private SearchView search; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_two); showSearchText=(TextView)findViewById(R.id.showSearchText); ActionBar actionBar=getActionBar(); if(actionBar!=null){ //启用回退按钮 actionBar.setDisplayHomeAsUpEnabled(true); //禁止窗体标题显示 actionBar.setDisplayShowTitleEnabled(false); } } @Override public boolean onCreateOptionsMenu(Menu menu) { //加载Menu资源文件生成Menu对象 getMenuInflater().inflate(R.menu.test_two, menu); //先取出Item MenuItem item=menu.findItem(R.id.searchText); //从Iitm中取出绑定的ActionView search=(SearchView) item.getActionView(); //绑定事件 search.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ showSearchText.setVisibility(TextView.VISIBLE); }else{ showSearchText.setVisibility(TextView.GONE); } } }); search.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { showSearchText.setText("搜索:"+newText); return false; } }); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }}二、
2.4、页面二:xml布局
activity_test_two.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.open_open.androidch09_newstishi.TestTwoActivity" > <TextView android:id="@+id/showSearchText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" android:visibility="gone"/></RelativeLayout>
二
3.1、其他方法:新建一个包:com.example.util新建一个activity : MenuIconUtil.java
这个方法是获取图标Icon信息,然后修改属性
package com.open_open.androidch09_newstishi.com.example.util;import java.lang.reflect.Method;import android.view.Menu;public class MenuIconUtil { //通过反射获取menu,然后修改属性设置图像可以显示 public static void setIconEnable(Menu menu, boolean enable) { try{ Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder"); Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class); m.setAccessible(true); //下面传入参数 m.invoke(menu, enable); }catch (Exception e){ e.printStackTrace(); } }}
新建一个 menu 文件,新建四个列表文件:这4个就是表单信息。
解释一下showAsAction 属性: (摘自其他人的博客)
安卓开发项目文件中有一个目录叫做menu,
item选项里有一句 android:showAsAction = "never"那么这句话是做什么用的呢?
原来是特定版本用到的,当你的应用程序版本为( Android 3.0)时,
你可以利用Action Bar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角,
对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。
这个属性可接受的值有:
1.always:这个值会使菜单项一直显示在ActionBar上。
2.ifRoom:如果有足够的空间,这个值会使菜单显示在ActionBar上。
3.never:这个值菜单永远不会出现在ActionBar是。
4.withText:这个值使菜单和它的图标,菜单文本一起显示。
为了节省,很多我都是never,当然大家也可以一一改为:always,展开查看
3.2.1、listitem_contextmenu.xml
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/listupdate" android:orderInCategory="100" android:showAsAction="never" android:title="修改" /> <item android:id="@+id/listdelete" android:orderInCategory="100" android:showAsAction="never" android:title="删除" /></menu>
3.2.2、main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.androidch09.MainActivity" > <item android:id="@+id/action_settings" android:orderInCategory="100" android:showAsAction="never" android:title="@string/action_settings"/></menu>
3.2.3、test_one.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.androidch09.TestOneActivity" > <!-- 定义菜单 --> <item android:id="@+id/newFile" android:orderInCategory="100" android:showAsAction="never" android:icon="@drawable/meizi" android:title="新建文件"/> <item android:id="@+id/openFile" android:orderInCategory="100" android:showAsAction="never" android:icon="@drawable/meizi" android:title="打开文件"/> <item android:id="@+id/exit" android:orderInCategory="100" android:showAsAction="never" android:icon="@drawable/meizi" android:title="退出"/><item android:id="@+id/colors" android:orderInCategory="100" android:showAsAction="never" android:icon="@drawable/meizi" android:title="颜色"> <menu> <item android:id="@+id/cred" android:orderInCategory="100" android:showAsAction="never" android:title="红色"/> <item android:id="@+id/cgreen" android:orderInCategory="100" android:showAsAction="never" android:title="绿色"/> <item android:id="@+id/cblue" android:orderInCategory="100" android:showAsAction="never" android:title="蓝色"/> </menu> </item> <!-- 定义一些显示在ActionBar上的菜单 --><item android:id="@+id/manager" android:orderInCategory="100" android:showAsAction="always" android:title="管理"> <menu> <item android:id="@+id/m1" android:orderInCategory="100" android:showAsAction="never" android:title="添加"/> <item android:id="@+id/m2" android:orderInCategory="100" android:showAsAction="never" android:title="修改"/> <item android:id="@+id/m3" android:orderInCategory="100" android:showAsAction="never" android:title="删除"/> </menu> </item></menu>
3.2.4、test_two.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.androidch09.TestTwoActivity" > <item android:id="@+id/searchText" android:orderInCategory="100" android:actionViewClass="android.widget.SearchView" android:title="搜索" android:showAsAction="always"/></menu>
4、Values文件夹:
4.1、string.xml
<resources> <string name="app_name">菜单和通知</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="title_activity_test_one">页面一</string> <string name="title_activity_test_two">页面二</string> <string-array name="citys"> <item>北京</item> <item>上海</item> <item>珠海</item> <item>中山</item> </string-array></resources>
如果没有标题,把这两行代码加上在style 中
<item name="android:windowActionBar">true</item> <item name="android:windowNoTitle">false</item>别忘了icon 图标中有一张图片 ,自己添加吧。
- 【Android 初学者】菜单和消息提醒
- Android消息提醒
- android 消息提醒(Toast,Notification)
- Android 桌面图标消息数提醒
- Android 桌面图标消息数提醒
- Android luancher消息提醒-ShortcutBadger
- 一个简单的顶部菜单消息提醒功能
- 原生NavigationView菜单中添加消息提醒(小红点)
- 原生NavigationView菜单中添加消息提醒(小红点)
- 原生NavigationView菜单中添加消息提醒(小红点)
- [android]消息的小图标提醒
- android实现消息提醒,拨打电话功能
- Android自定义带消息提醒控件
- Android----------短信消息提醒(Notification)
- android 消息提醒控件之 Toast
- Android给控件添加消息提醒
- js桌面消息提示和title提醒
- Android Fragment + ViewPager 实现类微信 底部导航栏 和 显示消息提醒
- safa
- 谈谈socket 套接字
- android.os.Build类字段含义
- docker命令之volume
- Ubuntu14(16也可以) apache2 伪静态配置
- 【Android 初学者】菜单和消息提醒
- 用Mysql5.6出现时间问题Incorrect datetime value: '' for column 'createtime'
- 微信公众平台开发教程(二)
- gitlab上传代码过大
- 论文:Sketch-a-Net that Beats Humans(附带CNN的理解)
- 基于百度地图二次开发的图层添加
- 1508-张晨曦总结《2016年-12月-8日》【连续48天总结】
- 详解 Dagger2 系列,原来 Dagger2 如此简单
- APP图标设置 开机动画图片设置