(四)、 创建(初始化选项/系统菜单) @Override public boolean onCreateOptionsMenu (Menu menu) { getMenuInflater().inflate( R.menu.main , menu);// 用指定的 R.menu.main 布局填充Menu对象 res/menu/main.xml return true;//如果返回false,菜单将不可见 } (五)、菜单操作(点击菜单项的响应事件): @Override public boolean onOptionsItemSelected (MenuItem item) { int id = item. getItemId ();//获取被点击菜单项的id if (id == R.id.action_settings) {//启动系统设置页面 startActivity(new Intent( android.provider. Settings. ACTION_DISPLAY_SETTINGS ));//常量字符串 return true;//如果匹配了id,成功处理了菜单项点击事件,则返回true. } return super.onOptionsItemSelected(item);//如果未能处理,则要调用父类中的被重写方法 } 案例: 利用以上定义的xml菜单文件,实现通过菜单选项对文字的大小和颜色进行控制。 提示: 设置TextView的字体:tv.setTextSize(float); 修改背景颜色(为红色/绿色/随机颜色):tv.setBackgroundColor(Color.rgb(red, green, blue));//0-255 修改字体颜色(为红色/绿色/随机颜色):tv.setTextColor(Color.rgb(red, green, blue)); 核心代码如下: MainActivity.java @Override public boolean onOptionsItemSelected (MenuItem item) { switch (item. getItemId ()) { case R.id.font_20: text_main_info.setTextSize(20); break; case R.id.font_30: text_main_info.setTextSize(30); break; case R.id.font_red: text_main_info.setTextColor(Color.RED); break; case R.id.font_green: text_main_info.setTextColor(Color.GREEN); break; } return super.onOptionsItemSelected(item); } 二、 ContextMenu 上下文菜单 : (一)、上下文菜单介绍: 上下文菜单继承自android.view.Menu。 1、上下文菜单与Options Menu 最大的不同在于 : Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View; 每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,哪个View需要上下文菜单就通过Activity的 registerForContextMenu (View view)给这个View注册上下文菜单。 2、生成上下文菜单是通过Activity中的 onCreate Context Menu ()方法: onCreateContextMenu (ContextMenu menu, View v, ContextMenu. ContextMenuInfo menuInfo)该方法类似于生成Options Menu的onCreate Options Menu(Menu menu)方法; 两者的不同在于: onCreate Options Menu只在用户 第一次按“Menu”键时被调用 , 而onCreateContextMenu会在用户每一次长按 注册了上下文菜单的View 时被调用。 3、第三个参数 ContextMenuInfo 有什么用呢? ContextMenuInfo 一般用在 AdaterViews 上(例如:Spinner 、ListView或GridView),它里面携带了 AdapterView中的position的信息 。 //需要先进行对象造型(向下转型) AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo; int pos = acmi. position ;//活动该条目在AdapterView中的位置下标信息 (二)、开发上下文菜单的步骤: 1、重写 onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo)方法; 2、调用Activity的 registerForContextMenu (View view)方法为view组件注册上下文菜单;注册上下文菜单后,意味着用户 长按该控件 后显示上下文菜单。 3、为菜单项提供响应,重写 onContextItemSelected (MenuItem item)。[注意区别于上下文菜单的 onOptionsItemSelected ] (三)、示例代码: private TextView text_main_info; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text_main_info = (TextView) findViewById(R.id.text_main_info); this. registerForContextMenu (text_main_info);// 注册上下文菜单到text_main_info组件上 } @Override public void onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); // 注意:引用的是menu资源文件,不是R.id.xx getMenuInflater(). inflate (R. menu . contextmenu_main , menu);//填充菜单 // 可以根据v.getId()来区分哪个组件要显示上下文菜单,根据组件不同,可以显示不同的上下文菜单 menu.add("abc");//在上下文菜单的事件处理方法中,可以通过MenuItem对象的getTitle().toString()方法得到,以区分是哪个菜单项被点击 menu.add(R.string.hello_world);//利用字符串资源添加菜单,在res/values/strings.xml中 menu. setHeaderTitle ("title....");//设置上下文菜单头部标题 menu. setHeaderIcon (R.drawable.ic_launcher);//设置上下文菜单头部图标 } @Override public boolean onContextItemSelected (MenuItem item) { switch ( item.getItemId() ) {//也可以通过item.getTitle()获取菜单项上的字符串进行比较 case R.id.font_20: text_main_info.setTextSize(20); break; case R.id.font_30: text_main_info.setTextSize(30); break; case R.id.font_red: text_main_info.setTextColor(Color.RED); break; case R.id.font_green: text_main_info.setTextColor(Color.GREEN); break; } return super.onContextItemSelected(item); } AlertDialog ——简单对话框(警告对话框) 父类: android.app.Dialog 创建AlertDialog对话框的步骤 1、创建AlertDialog.Builder对象,该对象能创建AlertDialog Builder是AlertDialog的一个静态内部类 2、调用Builder对象的方法设置图标、标题、内容、按钮等 setTitle():为对话框设置标题 setIcon ():设置图标 setMessage ():设置要显示的信息 setPositiveButton ():设置 积极( 确定)按钮(右边) setNegativeButton ():设置 消极 (取消)按钮(左边) setNeutralButton ():设置 中立 按钮(中间) 3、调用Builder对象的 create ()方法创建AlertDialog对话框 4、调用AlertDialog的 show ()方法来显示对话框,也可以直接用Builder对象调用show()方法 当希望用户点击 回退 按钮时,弹出对话框,提醒是否真的要退出,应重写Activity的 onKeyDown (int keyCode, KeyEvent event)方法,判断是回退按钮被点击,就弹出提示对话框. if(keyCode==KeyEvent. KEYCODE_BACK ){.......}
ProgressDialog——进度对话框 父类: android.app.AlertDialog 创建 ProgressDialog 对话框的步骤 1.实例化ProgressDialog,创建出ProgressDialog对象 2.调用该对象的方法设置图标、标题、内容、按钮等 setTitle():为对话框设置标题 setIcon ():设置图标 setMessage ():设置要显示的信息 setProgressStyle( ):设置进度条的样式 3.调用 ProgressDialog 对象的show()方法显示出 ProgressDialog 对话框 注意:不能阻塞UI线程,不能在子线程(工作线程)中直接操作UI组件! public class ProgressDialogActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyTask().execute(""); //启动异步任务 } class MyTask extends AsyncTask <String, Integer, Void>{ private ProgressDialog pd; @Override protected void onPreExecute () { super.onPreExecute(); pd = new ProgressDialog(ProgressDialogActivity.this); pd. setMax (100);//设置最大进度 pd.setTitle("title"); pd.setMessage("message"); pd.setProgressStyle( ProgressDialog.STYLE_HORIZONTAL );//设置水平样式 pd.show(); } @Override protected Void doInBackground (String... params) { for(int i = 0;i<100;i+=10){ publishProgress (i);//通知修改进度 //禁止在工作线程中直接操作ProgressDialog或其他UI组件,因为它们不在同一个线程中. try { Thread.sleep(500);//模拟耗时操作阻塞 } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate (Integer... values) { super.onProgressUpdate(values); pd. setProgress (values[0]);//更新进度 } @Override protected void onPostExecute (Void result) { super.onPostExecute(result); pd. dismiss (); } } } Toast 吐司 创建吐司的两种方式: 1. 通过静态方法Toast makeText(Context context, int resId, int duration)来创建Toast对象 int resId:R.string.xxx 也可以调用重载的方法,传字符串String 注意:只有通过本方法创建的Toast才能setText(...);其他方式创建的Toast不能调用setText(...)方法 2. 通过构造方法Toast(Context context)来创建对象 之后再利用下面的方法: setView (View view) 设置自定义内容的View,可以是TextView,ImageView等 案例:创建一个TextView,在里面设置文本,并把TextView作为此方法的参数 setGravity (int gravity, int xOffset, int yOffset) 设置出现的位置(例如:Gravity.TOP)及X/Y轴的偏移量 例如: t.setGravity(Gravity.TOP, 0, 0);表示出现在顶部,水平居中.如果没有调用本方法,则默认出现在屏幕中下部居中. setMargin (float horizontalMargin, float verticalMargin) 设置水平和垂直方向的外边距,参数为屏幕宽/高的 百分比 (0.0f~1.0f),为了效果明显,Toast的内容要简短一些. horizontalMargin The horizontal margin, in percentage of the container width, between the container's edges and the notification verticalMargin The vertical margin, in percentage of the container height, between the container's edges and the notification 例如: t.setMargin(0.2f, 0.4f);//表示从基础位置向右20%的屏幕宽,再向下40%的屏幕高 setDuration (int duration) 设置显示的时间:Toast.LENGTH_SHORT(常量值0), Toast.LENGTH_LONG(常量值1) show () 显示吐司