您的位置:首页 > 其它

动作栏和选项菜单

2016-06-06 22:03 585 查看

关于Menu菜单

官方API给出的定义是 By default, every Activity supports an options menu of actions or options.默认情况下一个Activity都支持一个选项菜单的操作.

Android中菜单分为三种:选项菜单 上下文菜单 弹出菜单

一、选项菜单

(一)创建Menu(可以通过手机硬件的Menu键弹出菜单)

通过重写onCreateOptionsMenu(Menu menu)方法.

1、纯代码实现

public class MenuActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_layout);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//添加菜单项
menu.add(1, 100, 1, "纯代码");
//参数为int groupId 组Id,int itemId 项ID 后面相关事件处理时会用到,
// int order 根据order进行位置的排序,CharSequence title 标题
menu.add(1, 101, 2, "实现");
return super.onCreateOptionsMenu(menu);
}
}




2、通过MenuInflater解析XML

①在Res\menu文件夹中新建menu.xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action1"
android:title="MenuInflater" />
<item
android:id="@+id/action2"
android:title="实现" />
</menu>
②重写onCreateOptionsMenu()方法,通过MenuInflater加载解析上面的menu.xml文件
public class MenuActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_layout);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//============通过getMenuInflater实例化MenuInflater
MenuInflater menuInflater = getMenuInflater();
//============菜单解析器MenuInflater加载解析munu.xml文件
menuInflater.inflate(R.menu.mymenu, menu);
return super.onCreateOptionsMenu(menu);
}

}




(二)ActionBar与OptionMenu

ActionBar在android5.0之后被ToolBar取代,用法与ToolBar类似

(三)ToolBar与OptionMenu

1、ToolBar工具栏

继承自Viewgroup,所以使用它时可以在XML中直接添加.

使用ToolBar可以使在不同Android版本下标题栏表现形式相同

2、ToolBar与ActionBar

ToolBar相对于ActionBar,自定义的空间更加充足,方便

3、设置OptionMenu在标题栏中显示

①要使用ToolBar时,需要在相应的Activity中的Theme(主题)中<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">的parent属性设置为NoActionBar

②在布局文件中直接添加ToolsBar并设置属性

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:logo="@drawable/logo"
app:navigationIcon="@drawable/home"
app:subtitle="Menu"
app:title="ToolBar" />
</LinearLayout>


需要注意的地方:

Toolbar是5.0加入的,如果需要兼容5.0以下的版本 要使用support.v7.widget包下的Toolbar

设置logo navigationIcon等Toolbar特有属性时需要添加命名控件xmlns:app="http://schemas.android.com/apk/res-auto"

③新建menu.mxl文件,与上面新建menu方法相同

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action1"
android:title="action1"
app:showAsAction="always" />
<item
android:id="@+id/action2"
android:title="action2" />
</menu>


showAsAction属性会在后面介绍

④重写onCreateOptionsMenu()方法,通过实例化ToolBar并调用InflaterMenu解析加载menu.xml文件

public class MenuActivity extends AppCompatActivity {
Toolbar mMyToolBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_layout);
mMyToolBar = (Toolbar) findViewById(R.id.my_toolbar);
mMyToolBar.inflateMenu(R.menu.mymenu);
}




4、相关事件处理

setOnMenuItemClickListener()菜单项点击事件监听

mMyToolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
//===通过获取item的id判断是哪个项在进行操作
switch (item.getItemId()) {
case R.id.action1:
Toast.makeText(getApplicationContext(), "Action1进行操作", Toast.LENGTH_SHORT).show();
case R.id.action2:
Toast.makeText(getApplicationContext(), "Action2进行操作", Toast.LENGTH_SHORT).show();
}
return false;
}
});
setNavigationOnclickListener() 导航键点击事件监听

mMyToolBar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

4000
finish();
}
});


5、showAsAction属性

用来指定菜单项如何在动作栏中显示

定义
always总是在动作栏中显示
never永不在动作栏中显示
ifRoom有足够的控件就独立显示在动作栏中
withText显示title属性的值,可以和其他值一起使用
collapseActionView可伸缩的

二、上下文菜单ContextMenu

通过长按视图控件View弹出的Menu

(一)创建ContextMenu

public class ContextMenuActivity extends AppCompatActivity {
ListView mMyListView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_context_menu_layout);
mMyListView = (ListView) findViewById(R.id.mylistview);
//创建数据源
String[] list = new String[]{"option1", "option2", "option3"};
//创建适配器,管理数据源list
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, list);
//View加载适配器,适配器关联View和数据源使用View显示数据源list数据
mMyListView.setAdapter(arrayAdapter);
registerForContextMenu(mMyListView);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//每次长按View时都会调用onCreatContextMenu()方法
Log.v("ContextMenu", "创建成功");
//获取菜单解析器MenuInflater实例
MenuInflater menuInflater = getMenuInflater();
//解析器加载解析menu.xml文件
menuInflater.inflate(R.menu.mymenu, menu);
}
}




三、PopupMenu弹出菜单

PopupMenu是依附于视图控件View的模式菜单
(一)创建PopupMenu
public class PopupMenuActivity extends AppCompatActivity {
Button mMyPopupMenu;
PopupMenu popupMenu;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_popup_menu_layout);
mMyPopupMenu = (Button) findViewById(R.id.mypopupmenu);
popupMenu = new PopupMenu(this, mMyPopupMenu);
//PopupMenu.inflate内部封装了getMenuInflater().inflate(menuRes, mMenu);
//加载解析menu.xml文件
popupMenu.inflate(R.menu.mymenu);
mMyPopupMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//显示PopupMenu菜单
popupMenu.show();
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: