android ActionBar的使用(模仿微信界面)

来源:互联网 发布:桌面时钟显示软件 编辑:程序博客网 时间:2024/05/16 08:14
  1. 修改menu 文件下的main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    tools:context="com.ll.testactionbar.MainActivity" >    <item        android:id="@+id/action_search"        android:actionViewClass="android.widget.SearchView"        android:icon="@drawable/actionbar_search_icon"        android:title="@string/action_search"        android:showAsAction="ifRoom|collapseActionView"        />        1).id:唯一标示        2).icon:图标(要显示的图片)        3).title:文字        4).showAsAction:  showAsAction属性共有五个值:ifRoom、never、always、withText、collapseActionView,可以混合使用.            ifRoom:如果溢出则会显示在item中。            never:永远不会显示,只会在溢出列表中显示,而且只显示标题            always:永远都会显示            withText:显示文本标题。Action bar会尽可能的显示这个标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可能显示不全。            collapseActionView:声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。一般要配合ifRoom一起使用才会有效果。    <item        android:id="@+id/action_album"        android:icon="@drawable/ofm_photo_icon"        android:title="@string/action_album"/>    <item        android:id="@+id/action_collection"        android:icon="@drawable/ofm_collect_icon"        android:title="@string/action_collection"/>    <item        android:id="@+id/action_card"        android:icon="@drawable/ofm_card_icon"        android:title="@string/action_card"/>    <item        android:id="@+id/action_settings"        android:icon="@drawable/ofm_setting_icon"        android:title="@string/action_settings"/>    <item        android:id="@+id/action_feed"        android:icon="@drawable/ofm_feedback_icon"        android:title="@string/action_feed"/> </menu>

2.修改MainActivity中的代码

    private void setOverflowShowingAlways(){         try {            ViewConfiguration config = ViewConfiguration.get(this);            Field field = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");            field.setAccessible(true);            field.setBoolean(config, false);        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    } setOverflowShowingAlways方法使用反射屏蔽掉物理Menu键,不然在有物理Menu键的手机上,overflow按钮会显示不出来。   在OnCreate方法中调用    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        setOverflowShowingAlways();        getActionBar().setDisplayHomeAsUpEnabled(false);//不显示actionBar的返回图标    }重写onMenuOpened方法(使用反射让隐藏在overflow当中的Action按钮的图标显示出来) @Override    public boolean onMenuOpened(int featureId, Menu menu) {        if(featureId==Window.FEATURE_ACTION_BAR && menu!=null){            if(menu.getClass().getSimpleName().equals("MenuBuilder")){                try {                    Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);                    method.setAccessible(true);                    method.invoke(menu, true);                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }        return super.onMenuOpened(featureId, menu);    }

3.自定义actionBar的样式,修改values-v14文件下style.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android">  <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">    <item name="android:actionBarStyle">@style/WeChatActionBar</item>    <item name="android:itemBackground">@drawable/actionbar_bg_selector</item>    <item name="android:actionBarItemBackground">@drawable/actionbar_bg_selector</item>    <item name="android:itemTextAppearance">@style/WeChatActionBarOverflow</item>    <item name="android:actionOverflowButtonStyle">@style/WeChatActionButtonOverflow</item>  </style>  <style name="WeChatActionBar" parent="@android:style/Widget.Holo.ActionBar">    <item name="android:background">#303537</item>    <item name="android:titleTextStyle">@style/WeChatActionBarTitleText</item>  </style>  <style name="WeChatActionBarTitleText" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">    <item name="android:textColor">#cfcfcf</item>    <item name="android:textSize">17sp</item>  </style>  <style name="WeChatActionBarOverflow" parent="@android:style/Widget.ActionButton.Overflow">    <item name="android:textSize">16sp</item>  </style>  <style name="WeChatActionButtonOverflow" parent="android:style/Widget.Holo.ActionButton.Overflow">    <item name="android:src">@drawable/actionbar_add_icon</item>  </style></resources>

4.如果子菜单中再添加子菜单使用自定义ActionProvider

package com.example.wechatsample;import android.content.Context;import android.view.ActionProvider;import android.view.MenuItem;import android.view.MenuItem.OnMenuItemClickListener;import android.view.SubMenu;import android.view.View;public class PlusActionProvider extends ActionProvider {    private Context context;    public PlusActionProvider(Context context) {        super(context);        this.context = context;    }    @Override    public View onCreateActionView() {        return null;    }    @Override    public void onPrepareSubMenu(SubMenu subMenu) {        subMenu.clear();        subMenu.add(context.getString(R.string.plus_group_chat))                .setIcon(R.drawable.ofm_group_chat_icon)                .setOnMenuItemClickListener(new OnMenuItemClickListener() {                    @Override                    public boolean onMenuItemClick(MenuItem item) {                        return true;                    }                });        subMenu.add(context.getString(R.string.plus_add_friend))                .setIcon(R.drawable.ofm_add_icon)                .setOnMenuItemClickListener(new OnMenuItemClickListener() {                    @Override                    public boolean onMenuItemClick(MenuItem item) {                        return false;                    }                });        subMenu.add(context.getString(R.string.plus_video_chat))                .setIcon(R.drawable.ofm_video_icon)                .setOnMenuItemClickListener(new OnMenuItemClickListener() {                    @Override                    public boolean onMenuItemClick(MenuItem item) {                        return false;                    }                });        subMenu.add(context.getString(R.string.plus_scan))                .setIcon(R.drawable.ofm_qrcode_icon)                .setOnMenuItemClickListener(new OnMenuItemClickListener() {                    @Override                    public boolean onMenuItemClick(MenuItem item) {                        return false;                    }                });        subMenu.add(context.getString(R.string.plus_take_photo))                .setIcon(R.drawable.ofm_camera_icon)                .setOnMenuItemClickListener(new OnMenuItemClickListener() {                    @Override                    public boolean onMenuItemClick(MenuItem item) {                        return false;                    }                });    }    @Override    public boolean hasSubMenu() {        return true;    }}  <item        android:id="@+id/action_plus"        android:icon="@drawable/actionbar_add_icon"        android:showAsAction="ifRoom|collapseActionView"        android:actionProviderClass="com.ll.testactionbar.PlusActionProvider"        android:title="@string/action_plus"/>
0 0