2.4 相关知识
相关知识
ActionBar
Action Bar是一种导航栏功能,在Android 3.0之后加入到系统的API当中,它识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。ActionBar可以自动适应各种不同大小的屏幕。
图2-4-5 ActionBar导航栏
如图2-4-5所示,1是ActionBar的图标,2是两个action按钮,这里放重要的按钮功能,为用户进行某项操作提供直接的访问;3是overflow按钮,放不下的按钮会被置于“更多...”菜单项中,“更多...”菜单项是以下拉形式实现的。
选项菜单
Android的菜单可以分为三种:OptionMenu(选项菜单)、ContextMenu(上下文菜单)、Popup Menu(弹出菜单)。
Android提供了标准的XML格式的资源文件来定义菜单项,并且对所有菜单类型都支持,推荐使用XML资源文件来定义菜单,之后再把它Inflater到Activity中,而不是在Activity中使用代码声明。
菜单的XML资源文件,创建在/res/menu/目录下,包含以下几个元素:
1) <menu>,定义一个Menu,是一个菜单资源文件的根节点,里面可以包含一个或者多个<item>和<group>元素;
2) <item>,创建一个MenuItem,代表了菜单中一个选项;
3) <group>,对菜单项进行分组,可以以组的形式操作菜单项。
其中,<item>元素除了常规的id、icon、title属性的支持,还有一个属性android:showAsAction,这个属性描述菜单项以何种方式加入到ActionBar中。android:showAsAction的值有:
always:无论ActionBar空间是否溢出,总会显示;
ifRoom:如果有空间就显示,依据屏幕的宽窄而定;
never: 永远不会显示。只会在溢出列表中显示,而且只显示标题。
<group>是对菜单进行分组,分组后的菜单显示效果并没有区别,唯一的区别在于可以针对菜单组进行操作,这样对于分类的菜单项,操作起来更方便,提供如下的操作:
Menu.setGroupCheckable():菜单组内的菜单是否都可选;
Menu.setGroupVisible():是否隐藏菜单组的所有菜单;
Menu.setGroupEnabled():菜单组的菜单是否有用。
当创建好一个XML菜单资源文件之后,可以使用MenuInflater.inflate()方法填充菜单资源,使XML资源变成一个可编程的Menu对象。
创建选项菜单的步骤:
1) 重写Activity的onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用;
2) 调用Menu 的add( )方法添加菜单项(MenuItem) 或者通过加载菜单资源文件实现;
3) 重写Activity的OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件。
如果需要添加子菜单,可以在item节点添加menu节点,如下所示。
表2-4-3 Ex2_4_1 /res/menu/submenu.xml清单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_start"
android:title="开始游戏" />
<item
android:id="@+id/menu_setting"
android:title="相关设置">
<menu>
<item
android:id="@+id/setting_music"
android:title="音乐设置" />
<item
android:id="@+id/setting_view"
android:title="图像设置" />
</menu>
</item>
<item
android:id="@+id/menu_over"
android:title="结束游戏" />
</menu>
表2-4-4 Ex2_4_1 MainActivity.java清单
package com.example.ex2_4_1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.submenu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_over:
Toast.makeText(this, item.getTitle() +
"被单击", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_setting:
Toast.makeText(this, item.getTitle() +
"被单击", Toast.LENGTH_SHORT).show();
break;
case R.id.setting_music:
Toast.makeText(this, item.getTitle() +
"被单击", Toast.LENGTH_SHORT).show();
break;
case R.id.setting_view:
Toast.makeText(this, item.getTitle() +
"被单击", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, item.getTitle() +
"被单击", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
如果通过代码添加Menu选项,可以修改Ex2_4_1中的onCreateOptionsMenu方法如下:
表2-4-5 Ex2_4_1 MainActivity.java中onCreateOptionsMenu修改代码清单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,1,0,"开始游戏");
menu.add(0,3,0,"结束游戏");
SubMenu subMenu=menu.addSubMenu("相关设置");
subMenu.add(0,4,0,"声音设置");
subMenu.add(0,5,0,"图像设置");
return true;
}
上面代码中的add方法说明如下。
add (int groupId, int itemId, int order, CharSequence title)
参数说明:
- l groupId参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮;
- l itemId参数,代表的是菜单项的编号,这个参数非常重要,一个itemId对应一个menu中的选项,在后面使用菜单的时候,就靠这个item ID来判断你使用的是哪个选项;
- l order参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示;
- l title参数,表示选项中显示的文字。
上下文菜单
Context Menu顾名思义就是与context(上下文环境)相关的菜单。操作时,长按某个对象,就会弹出。
创建上下文菜单的步骤:
1) 重写Activity的onCreateContextMenu(Menu menu)方法,调用Menu的add()方法添加菜单项(MenuItem)
2) 重写Activity的onContextItemSelected(MenuItem iitem)来响应事件
3) 调用registerForContextMenu()方法来为视图注册上下文菜单。
案例Ex2_4_2,长按TextView弹出上下文菜单,清单如下。
表2-4-6 Ex2_4_2 /res/menu/main.xml清单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_copy"
android:title="复制" />
<item
android:id="@+id/menu_paste"
android:title="粘贴" />
</menu>
表2-4-7 Ex2_4_2 /res/menu/tip.xml清单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_tip"
android:title="提示信息" />
</menu>
表2-4-8 Ex2_4_2 /layout/activity_main.xml清单
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:id="@+id/tvTip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_red_light"
android:text="请在上面的内容上长按,在弹出的菜单中选择你需要的功能" />
</LinearLayout>
表2-4-9 Ex2_4_2 MainActivity清单
package com.example.ex2_4_2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
TextView tvContent,tvTip;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvContent=(TextView)findViewById(R.id.tvContent);
tvTip=(TextView)findViewById(R.id.tvTip);
//为两个控件注册上下文菜单
registerForContextMenu(tvContent);
registerForContextMenu(tvTip);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//通过id来区别不同的控件。
if(v.getId()==R.id.tvContent){
getMenuInflater().inflate(R.menu.main,menu);
}
if(v.getId()==R.id.tvTip){
getMenuInflater().inflate(R.menu.tip,menu);
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
}
}
弹出菜单
PopupMenu(弹出菜单),一般出现在被绑定的View的下方(如果下方有空间),用于提供快速简洁的操作。
创建弹出菜单的步骤:
1) 通过PopupMenu的构造函数实例化一个PopupMenu对象,需要传递一个当前上下文对象以及绑定的View。
2) 调用PopupMenu.setOnMenuItemClickListener()设置一个PopupMenu选项的选中事件。
3) 使用MenuInflater.inflate()方法加载一个XML文件到PopupMenu.getMenu()中。
4) 调用PopupMenu.show()方法显示。
案例Ex2_4_3,显示弹出式菜单,清单如下。
layout布局文件只有一个TextView,id设置为tvContent。清单略。
表2-4-10 Ex2_4_3 /res/menu/main.xml清单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_copy"
android:title="复制"></item>
<item
android:id="@+id/menu_paste"
android:title="粘贴"></item>
</menu>
表2-4-11 Ex2_4_3 MainActivity.java清单
package com.example.ex2_4_3;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener,PopupMenu.OnMenuItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvContent=(TextView)findViewById(R.id.tvContent);
tvContent.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//创建一个弹出式菜单对象
PopupMenu popup = new PopupMenu(this,v);
//填充菜单
MenuInflater inflater=popup.getMenuInflater();
inflater.inflate(R.menu.main,popup.getMenu());
//为弹出菜单设置菜单项单击监听器。
popup.setOnMenuItemClickListener(this);
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.menu_copy:
Toast.makeText(this,"复制中..",Toast.LENGTH_SHORT).show();
break;
case R.id.menu_paste:
Toast.makeText(this,"粘贴中....",Toast.LENGTH_SHORT).show();
break;
}
return false;
}
}
学员评价