手把手教你高仿微信6.0ActionBa

本文手把手教你如何实现类似微信6.0的ActionBar,包括无图片只有文字的左侧设置,加号图标替代overflowButton,以及点击加号显示文字加图片的子菜单效果。当设备有物理菜单键时,点击行为有所不同。通过具体代码示例和布局文件的讲解,轻松完成高仿微信6.0的ActionBar设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


高品质的应用,永远是被模仿的对象。So,今天我也来模仿的做一个微信6.0的actionbar。这次我用的是api自带的actionbar,仔细观察微信6.0你可以发现以下和传统actionbar不一样的地方:

1.在actionbar上的最左边微信6.0是没有图片的只有文字。

2.actionbar上的overflowButton与传统的不一样,微信6.0是个加号图标

3.当点击加号时,出现的子item是文字加图片的形式展现的。

4.当设备有存在物理菜单键时,点击时不是从底部出现的。

带着问题去做事情效率会更高些。废话不多说,begin!

首先,我们写好菜单的布局文件wen_xin.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.weixin.WeiXinActivity" >
    <item android:id="@+id/action_search"
          android:icon="@drawable/actionbar_search_icon"
        android:actionViewClass="android.widget.SearchView"
        android:title="@string/actionbar_search"
        android:showAsAction="ifRoom|collapseActionView" />

    <item
        android:id="@+id/acion_add_friend"
        android:title="@string/menu_addfriend"
        android:icon="@drawable/menu_add_icon"/>
    <item
        android:id="@+id/action_feedback"
        android:title="@string/menu_feedback"
        android:icon="@drawable/menu_feedback_icon"/>
    <item
        android:id="@+id/action_scan"
        android:title="@string/menu_scan"
        android:icon="@drawable/men_scan_icon"/>
    <item
        android:id="@+id/action_group_chat"
        android:title="@string/menu_group_chat"
        android:icon="@drawable/menu_group_chat_icon"/>
</menu>
android:actionViewClass=“android.widget.SearchView”代表这个是搜索框

android:showAsAction="ifRoom|collapseActionView"
即便在用于不适用的时候,也要占据操作栏的有效空间

布局文件写好之后,开始写activity,代码:

public class WeiXinActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wei_xin);
        setOverFlowButtonAlawys();
        //设置home处的图标是否存在
        getActionBar().setDisplayShowHomeEnabled(false);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.wei_xin, menu);
        return true;
    }

    /**
     * 在显示选择菜单调用 ,该方法在onPrepareOptionsMenu方法之后调用。
     * @param featureId
     * @param menu
     * @return
     */
    @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) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    //overflowbutton总是显示 ,不论是否存在物理按钮
    private void setOverFlowButtonAlawys(){
        ViewConfiguration configuration = ViewConfiguration.get(this);
        try {
            Field menuKey = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            menuKey.setAccessible(true);
            menuKey.setBoolean(configuration,false);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
setOverFlowButtonAlawys()方法主要是用来防止 在存在物理键的设备上不显示overflowbutton按钮,其中用到了java的反射机制。动态加载时,改变viewconfiguration中一个属性值。
 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) {
                    e.printStackTrace();
                }
            }
        }
这段代码,具体的职责是为了让子item以图标和文字的形式一起展示。其中也是用到了java的反射机制(可见一定要有读源码的能力,要不然想破天也不知道其中会有这写方法)。

以上就是仿微信6.0的actionbar的所有代码。很简单吧,(代码写的不严谨,仅供参考)最后附上一张效果图。


图标在我点击这里下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值