3.关于ActionBar的设计

ActionBar是在app中比较常见的控件,在actionBar上可以显示返回键、title、图片以及overflow。
1.在actionBar上显示图片
在oncreate()函数中加入以下代码

       ActionBar actionBar = getSupportActionBar();
       actionBar.setLogo(R.drawable.duanxin);
     //设置显示的图片(在这里的图片推荐背景为透明,格式为png,采用drawable资源的方式导入,这样能够避免图片背景和actionBar的背景差异)
       actionBar.setDisplayUseLogoEnabled(true);//设置是否使用setLog()设置的图片
       actionBar.setDisplayShowHomeEnabled(true);//设置是否显示图片
       actionBar.setDisplayHomeAsUpEnabled(true);//是否显示返回按钮

2.在actionBar显示title
使用actionBar对象调用setTitle()进行设置
3.在actionBar显示overflow
创建overflow需要重写onCreateOptionmenu()和onOptionItemSelected()函数,另外含需要通过反射的方式调用setOptionalIconsVisible()改变mOptionalIconsVisible的设定值(设定值不更改为true那通过setIcon()设置的图片无法显示),由于在android4.0系统中MenuBuilder类做了一些更改,mOptionalIconsVisible的初始值为false,我们需要通过setOptionalIconsVisible()将其设置为true。这样就需要创建一个MenuBuilder对象,但由于MenuBuilder为系统的内部框架类,所以无法创建。
具体代码如下:

@override
    public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);
            seticonEnable(menu,true);//通过反射更改mOptionalIconsVisible的设定值
            menu.add(0,item1,0,"12").setIcon(R.drawable.ic_launcher_foreground);//往overflow中添加item
            menu.add(0,item2,1,"34").setIcon(R.drawable.ic_launcher_foreground);//add(group id,item id,order id,title)
            return  true;
    
        }


    private void seticonEnable(Menu menu,boolean enable)
    {

        try {
            Class<?> clazz = Class.forName("android.support.v7.view.menu.MenuBuilder");
 
 //笔记:使用V7包注意这里不是"com.android.internal.view.menu.MenuBuilder" 
Class.forName(xx.xx)返回的是一个类,这个函数的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码(static代码)
这个方法后面通常会跟一个newInstance()进行实例化,这样返回的就不是一个类而是一个object。
这种实例化的方法与new相比就是能够动态的进行实例化操作,前者使用的是类加载机制进行对象创建,后者是通过创建一个新类。
在使用new这个关键字进行对象创建时,这个类可以没有被加载。但是使用newInstance()进行创建时这个类必须已经被加载连接了。
newinstance()方法只能实例化无参的对象。
 

    Method method=clazz.getDeclaredMethod("setOptionalIconsVisible",boolean.class);

//笔记:获取类中Method方法对象的方法有多个,其中包括:
getMethod()------调用公共方法,但不能调用私有方法
getDeclaredMethod()--------调用类或接口的指定已声明的方法,返回method对象
    

    method.setAccessible(true);

//笔记:AccessibleObject类是Field、Methed、Constructor对象的基类setAccessible()是启用和禁用访问安全检查的开关,true指示反射的对象在使用时应取消java语言访问检查,false则指示反射的对象应实施java语言访问检查。
在使用Fiel、Method、Constructor对象来设置或获取字段、调用方法、创建和初始化类的实例时会执行访问检查。

            method.invoke(menu,enable);
//笔记:执行menu对象中带有enable参数的对象

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }


    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      switch(item.getItemId()) {
        case item1:
            Toast.makeText(MainActivity.this,"点我干毛",Toast.LENGTH_SHORT).show();
        case item2:
            Toast.makeText(MainActivity.this,"别点我",Toast.LENGTH_SHORT).show();}
    return super.onOptionsItemSelected(item);
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值