选项菜单_上下文菜单_子菜单_图标菜单_自定义菜单_联系人标记弹出菜单

菜单控件<Menu >

选项菜单(Option Menu)

单击Menu实体按钮弹出,android中把它叫做option menu

上下文菜单(ContextMenu Menu的子接口)

android中长按视图控件后出现的菜单

子菜单:(SubMenu  Menu的子接口)

通过addSubMenu方法添加。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。

图标菜单:这个比较简单,就是通过setIcon添加icon的菜单项 子菜单和上下文菜单不能带图像(只能有选项按钮和复选按钮)

普通列表菜单(ListView) 上节讲过

选项菜单

以下都是Activity类的方法 可以重写

OnCreateOptionsMenu() (创建)

onOptionsMenuClosed(OptionMenu关闭时调用)

onPrepareOptionsMenu(Option菜单显示之前调用,可用来修改OptionMenu菜单项)

onMenuOpened(Option菜单显示时调用,如果返回false则不显示

这个方法在 onPrepareOptionsMenu之后被调用)

 

响应选项菜单项单击事件的3种方法:

接口MenuItem的子接口OnMenuItemClickListener,该接口中有一个

onMenuItemClick方法

Option菜单、子菜单、上下文菜单的菜单项都有效。

如果该菜单项注册了监听setOnMenuItemClickListener(this),则单击时会调用onMenuItemClick方法

如果onMenuItemClick方法返回true,并且菜单项关联了一个Intent,也不会调用startActivity去显示关联的Activity

如果onMenuItemClick方法返回true,则不会执行以下两个单击事件

2. 接口MenuItemonMenuItemSelected方法

3. ActivityonOptionsItemSelected方法

public boolean onMenuItemSelected(int featureId, MenuItem item)

{

    super.onMenuItemSelected(featureId, item);/*调用onOptionsItemSelected方法*/

    Log.d("onMenuItemSelected:itemId=", String.valueOf(item.getItemId()));

    return true;

}

 

选项按钮和复选框的菜单

接口MenuItem的一些方法:

setCheckable 将子菜单项设置成复选框类型

setChecked  将子菜单项选中

setGroupCheckable 第一个参数GroupId

                 第二个参数true,能显示按钮

                 第二个参数false,不显示按钮(默认)

                 第三个参数true,选项按钮(单选)

                 第三个参数false,复选按钮(多选)

 

单击事件.

View的子接口 OnClickListener,该接口中有一个onClick方法

如果按钮注册了监听setOnClickListener (this),则单击时会调用onClick方法

上下文菜单

上下文菜单与选项菜单类似,也分为菜单头和菜单项

上下文菜单可以与任意的View进行关联,

上下文菜单必须注册到指定的View才能显示,长按显示

registerForContextMenu(注册到指定View)

onCreateContextMenu (创建调用)

onContextItemSelected(选中调用)

 

EidtView有系统的上下文菜单,系统会自动将我们自定义的上下文菜

单添加到系统的上下文菜单之后。

 

响应上下文菜单项单击事件的3种方法,与选项菜单项类似。

XML添加菜单getMenuInflater().inflate(R.menu.file_menu, menu);

<menu xmlns:android=”http://schemas.android.com/apk/res/android”>

    <item android:title=”新建”>

    <item android:title=”打开”>

    <item android:title=”退出”>

</menu>


注意事项:

1.选项菜单最多显示6个,超过6个会显示更多或者”more”

2.选项菜单可以setIcon,上下文菜单和子菜单不可以

3.上下文菜单支持CATEGORY_ALTERNATIVE(动态菜单技术),

选项菜单()不支持。

动态菜单技术:若一个activity

其类型是”android.intent.category.ALTERNATIVE”,

数据是”vnd.android.cursor.dir/vnd.google.note”的话,

系统就会为这个activity动态增加一个菜单项


自定义菜单

通过重写Activity类的onKeydown方法和PopWindow实现

Private int state=2;/*状态变量,1:选项菜单已弹出 2.选项菜单未弹出*/

public boolean onKeyDown(int keyCode, KeyEvent event)

switch (keyCode)

{

case KeyEvent.KEYCODE_MENU:

                              if (state == 1)/*选项菜单已弹出,不再弹出新的窗口*/

                                   return false;

                              layout = getLayoutInflater()

                                          .inflate(R.layout.menu_layout, null);/*装载布局文件*/

                              pop = new PopupWindow(layout, getWindowManager()

                                   .getDefaultDisplay().getWidth(), getWindowManager()

                                   .getDefaultDisplay().getHeight());/*创建PopupWindow对象*/

                              /*设置弹出窗口的位置在底部/

                              pop.showAtLocation(layout, Gravity.BOTTOM, 0, 0);

                              View home = layout.findViewById(R.id.home);

                              /*为“首页”设置单击事件*/

                              home.setOnClickListener(new OnClickListener()

                              {

                                   public void onClick(View view)

                                   {

                                          Toast.makeText(Main.this, "单击定制菜单.", Toast.LENGTH_LONG).show();

                                          pop.dismiss();

                                          state = 2;

                                   }

                              });

                              state = 1;

                              return false;

case KeyEvent.KEYCODE_BACK:

                              if (state == 1){

                                   pop.dismiss();/*关闭popupWindow*/

                                   state = 2;

                              }

                              else if (state == 2){

                                   finish();/*关闭当前Activity*/

                              }

                              return false;

}

/*其他按钮的单击事件依然调用Activity类的onKeyDown方法响应*/

return super.onKeyDown(keyCode, event);


自定义菜单二

通过OnMenuOpenedonCreateOptionsMenu相互配合实现

Oncreate方法:

//创建在弹出窗口中显示的GridView对象

GridView gvPopupWindow = (GridView) getLayoutInflater().inflate(

                              R.layout.popup_window, null);

//GridView提供数据的Adapter对象 自定义的GridAdapter

GridAdapter gridAdapter = new GridAdapter(this);

gvPopupWindow.setAdapter(gridAdapter);

gvPopupWindow.setOnKeyListener(this);

gvPopupWindow.setOnItemClickListener(this);

popup = new PopupWindow(gvPopupWindow, LayoutParams.FILL_PARENT,

                              LayoutParams.WRAP_CONTENT);

popup.setFocusable(true);

 

抽象类AdapterView的子接口OnItemClickListener有一个方法onItemClick

如果注册了监听setOnItemClickListener (this),则单击时会调用onItemClick方法

 

View的子接口OnKeyListener有一个方法onKey

如果注册了监听setOnKeyListener (this),则单击时会调用onKey方法

 

public boolean onCreateOptionsMenu(Menu menu){

menu.add("menu");// 必须创建一项 否则系统不会调用onMenuOpened方法

return super.onCreateOptionsMenu(menu);

}

 

public boolean onMenuOpened(int featureId, Menu menu){

if (popup != null){

if (popup.isShowing())

popup.dismiss();

else{

View layout = getLayoutInflater().inflate(R.layout.main, null);

popup.showAtLocation(layout, Gravity.CENTER, 0, 0);/*居中弹出菜单*/

}

}

return false;

}

}


QuickContactBadge<联系人标记弹出菜单>

只显示图像菜单

<QuickContactBadge style="?android:attr/quickContactBadgeStyleWindowSmall" />

显示图像菜单和联系人姓名

<QuickContactBadge style="?android:attr/quickContactBadgeStyleWindowLarge" />

 

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("

                                   + Contacts.HAS_PHONE_NUMBER + "=1) AND ("

                                   + Contacts.DISPLAY_NAME + " != '' ))";/*SQL语句*/

 

Cursor cursor = getContentResolver().query(Contacts.CONTENT_URI,

                                   CONTACTS_SUMMARY_PROJECTION, select, null,

                                   Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");/*查询数据库*/

cursor.moveToFirst();/*将指针记录移动到第一条记录*/

QuickContactBadge badge1 = (QuickContactBadge) findViewById(R.id.badge1);

QuickContactBadge badge2 = (QuickContactBadge) findViewById(R.id.badge2);

long contactId = cursor.getLong(cursor

                                   .getColumnIndex(Contacts._ID));

String lookupKey = cursor.getString(cursor

                                   .getColumnIndex(Contacts.LOOKUP_KEY));

badge1.assignContactUri(Contacts.getLookupUri(contactId,

                                   lookupKey));/*将当前联系人和QuickContactBadge控件关联

}

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值