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);
}