高品质的应用,永远是被模仿的对象。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的所有代码。很简单吧,(代码写的不严谨,仅供参考)最后附上一张效果图。