Android的Menu_Dialog----重新认识Android(8)

来源:互联网 发布:淘宝哪里有一元秒杀 编辑:程序博客网 时间:2024/06/09 13:42
一、OptionsMenu选项菜单(系统菜单): 
(一)、简介:
1、Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。
2、从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。
 
(二)、创建菜单:(Android提供了两种创建菜单的方式)
1、在java代码中创建菜单;menu.add("abc");
2、使用xml资源文件创建菜单(res/menu目录下)。[建议使用]
 
 
(三)、XML资源文件中定义菜单:
1、普通菜单:
 <item  菜单项
        android:id="@+id/menu_about"
        android:orderInCategory="2"  设置排序顺序,小的在前,大的在后
        android:showAsAction="never"   ActionBar的菜单项会用到其他值
        android:title="关于"/>         title是必须属性
 
2、二级菜单:
 <item
        android:id="@+id/menu_group2"
        android:orderInCategory="1"
        android:showAsAction="never"
        android:title="设置文字颜色">
        <menu>
            <group>  group可有可无,主要用于对菜单项进行批量管理
                <itemandroid:id="@+id/font_red" android:title="red" />
                <item android:id="@+id/font_green" android:title="green"></item>
                <item android:id="@+id/font_blue" android:title="blue"></item>
                <item android:id="@+id/font_yellow" android:title="yellow"></item>
            </group>
        </menu>
    </item>
注意: 要在右上角点击按钮弹出的菜单才能访问二级菜单


(四)、 创建(初始化选项/系统菜单)
 @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 booleanonOptionsItemSelected(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中的onCreateContextMenu()方法:
onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)该方法类似于生成Options Menu的onCreateOptionsMenu(Menu menu)方法;
两者的不同在于:
onCreateOptionsMenu只在用户第一次按“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 voidonCreateContextMenu(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 booleanonContextItemSelected(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 extendsAsyncTask<String, Integer, Void>{
  private ProgressDialog pd;
  @Override
  protected voidonPreExecute() {
   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 VoiddoInBackground(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 voidonProgressUpdate(Integer... values) {
   super.onProgressUpdate(values);
   pd.setProgress(values[0]);//更新进度
  }
  @Override
  protected voidonPostExecute(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() 
    显示吐司

0 0