您的位置:首页 > 移动开发 > Android开发

【Android】actionbar显示选项菜单

2016-09-18 08:31 393 查看
Actionbar是android3.0的重要更新之一。Actionbar位于传统标题栏的位置,也就是显示在屏幕的顶部。

Actionbar提供了如下功能:

1.显示选项菜单optionsMenu的菜单项(Action Item)。

2.使用程序图标作为返回Home主屏或向上的导航操作。

3.提供交互式View作为Action View。

4.提供基于Tab的导航方式,可用于切换多个Fragment。

5.提供基于下拉的导航方式。

下面来看看Actionbar用于显示选项菜单以及Action View。

Activity类:

[java]
view plain
copy
print?





package com.zzj.ui.actionbardemo;  
  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
  
import android.app.ActionBar;  
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuInflater;  
import android.view.MenuItem;  
import android.view.ViewConfiguration;  
import android.view.Window;  
import android.widget.Toast;  
  
import com.zzj.ui.R;  
  
public class ActionbarActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.actionbar_activity);  
  
        ActionBar actionBar = getActionBar();  
        // 是否显示应用程序图标,默认为true  
        actionBar.setDisplayShowHomeEnabled(true);  
        // 是否显示应用程序标题,默认为true  
        actionBar.setDisplayShowTitleEnabled(true);  
  
        /* 
         * 是否将应用程序图标转变成可点击的按钮,默认为false。 
         *  
         * 如果设置了DisplayHomeAsUpEnabled为true, 
         *  
         * 则该设置自动为 true。 
         */  
        actionBar.setHomeButtonEnabled(true);  
        /* 
         * 在应用程序图标的左边显示一个向左的箭头, 
         *  
         * 并且将HomeButtonEnabled设为true。 
         *  
         * 默认为false。 
         */  
        actionBar.setDisplayHomeAsUpEnabled(true);  
  
        forceShowOverflowMenu();  
  
    }  
  
    /** 
     * 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu 
     */  
    private void forceShowOverflowMenu() {  
        try {  
            ViewConfiguration config = ViewConfiguration.get(this);  
            Field menuKeyField = ViewConfiguration.class  
                    .getDeclaredField("sHasPermanentMenuKey");  
            if (menuKeyField != null) {  
                menuKeyField.setAccessible(true);  
                menuKeyField.setBoolean(config, false);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        MenuInflater inflater = getMenuInflater();  
        inflater.inflate(R.menu.actionbar_menu, menu);  
        return super.onCreateOptionsMenu(menu);  
    }  
  
    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        switch (item.getItemId()) {  
        /* 
         * 将actionBar的HomeButtonEnabled设为ture, 
         *  
         * 将会执行此case 
         */  
        case android.R.id.home:  
            finish();  
            break;  
        case R.id.add:  
            Toast.makeText(this, "添加", Toast.LENGTH_LONG).show();  
            break;  
        // 其他省略...  
        default:  
            break;  
        }  
        return super.onOptionsItemSelected(item);  
    }  
  
    @Override  
    public boolean onMenuOpened(int featureId, Menu menu) {  
        setOverflowIconVisible(featureId, menu);  
        return super.onMenuOpened(featureId, menu);  
    }  
  
    /** 
     * 显示OverflowMenu的Icon 
     *  
     * @param featureId 
     * @param menu 
     */  
    private void setOverflowIconVisible(int featureId, Menu menu) {  
        if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {  
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {  
                try {  
                    Method m = menu.getClass().getDeclaredMethod(  
                            "setOptionalIconsVisible", Boolean.TYPE);  
                    m.setAccessible(true);  
                    m.invoke(menu, true);  
                } catch (Exception e) {  
                    Log.d("OverflowIconVisible", e.getMessage());  
                }  
            }  
        }  
    }  
  
}  

主布局文件没什么,省略......
菜单文件res/menu/actionbar_menu.xml:

[html]
view plain
copy
print?





<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  
    <!-- action items -->  
    <!-- showAsAction默认为never -->  
    <item  
        android:id="@+id/delete1"  
        android:icon="@android:drawable/ic_menu_camera"  
        android:showAsAction="always"  
        android:title="拍照"/>  
    <item  
        android:id="@+id/add"  
        android:icon="@android:drawable/ic_menu_add"  
        android:showAsAction="ifRoom"  
        android:title="添加">  
    </item>  
    <item  
        android:id="@+id/delete2"  
        android:icon="@android:drawable/ic_menu_edit"  
        android:showAsAction="ifRoom"  
        android:title="编辑"/>  
    <item  
        android:id="@+id/share"  
        android:icon="@android:drawable/ic_menu_share"  
        android:showAsAction="never"  
        android:title="分享"/>  
    <item  
        android:id="@+id/call"  
        android:icon="@android:drawable/ic_menu_call"  
        android:showAsAction="never"  
        android:title="呼叫"/>  
    <item  
        android:id="@+id/delete3"  
        android:icon="@android:drawable/ic_menu_help"  
        android:showAsAction="never"  
        android:title="帮助"/>  
  
    <!-- action views -->  
    <item  
        android:id="@+id/search"  
        android:actionViewClass="android.widget.SearchView"  
        android:showAsAction="always"  
        android:title="查询"/>  
    <item  
        android:id="@+id/clock"  
        android:actionLayout="@layout/actionbar_layout_menu"  
        android:showAsAction="always"  
        android:title="时钟"/>  
  
  
</menu>  

时钟布局文件actionbar_layout_menu.xml:

[html]
view plain
copy
print?





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

效果:



代码解释见代码中的注释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: