Android应用软件开发

194课时
694学过
8分

课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
8分钟

2.4 相关知识

相关知识

ActionBar

Action Bar是一种导航栏功能,在Android 3.0之后加入到系统的API当中,它识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。ActionBar可以自动适应各种不同大小的屏幕。

30

图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;
    }
}
​