actionBar的溢出菜单(如果存在物理menu按键做适配请参考上一篇文章)在魅族手机上会显示在下方的smartBar上面,与其他手机的显示不一致,需要做适配。具体步骤有以下几步:
1、首先需要判断手机型号如果是魅族手机并还有smartBar那么就需要特殊处理进行适配
2、将溢出菜单的menuItem清空,然后添加一个单独menuItem,让其显示在actionBar上面作为溢出菜单使用
3、点击新添加的溢出菜单,弹出popupWindow,显示以前溢出菜单显示的内容
适配前界面如下:
适配后效果图如下:
上面说了实现的思路,下面我们来编写具体的代码:
1、菜单文件menu_main.xml 其中自定义溢出菜单选项我们需要进行判断,如果手机中有smartBar我们就让它显示,如果没有我们就让它不显示
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/progress"
android:title="刷新"
android:icon="@android:drawable/ic_menu_rotate"
android:showAsAction="always"/>
<item android:id="@+id/overMenu"
android:title="自定义溢出菜单"
android:icon="@drawable/ic_menu_moreoverflow_normal_holo_light"
android:showAsAction="always"
/>
<item
android:id="@+id/it_setting"
android:title="设置"
android:icon="@android:drawable/ic_menu_rotate"
android:showAsAction="ifRoom"/>
<item
android:id="@+id/it_share"
android:title="分享"
android:icon="@android:drawable/ic_menu_rotate"
android:showAsAction="ifRoom"/>
</menu>
2、判断手机是否有smartBar
public boolean hasSmartBar(){
try {
// 新型号可用反射调用Build.hasSmartBar()
Method method = Class.forName("android.os.Build").getMethod("hasSmartBar");
return ((Boolean) method.invoke(null)).booleanValue();
} catch (Exception e) {
}
// 反射不到Build.hasSmartBar(),则用Build.DEVICE判断
if (Build.DEVICE.equals("mx2")) {
return true;
} else if (Build.DEVICE.equals("mx") || Build.DEVICE.equals("m9")) {
return false;
}
return false;
}
3、如果有smartBar删除溢出菜单内容
public void dealMenuItem(Menu menu){
/**
* 清空溢出菜单中的menuItem
*/
menu.removeItem(R.id.it_setting);
menu.removeItem(R.id.it_share);
/**
* 添加自定义溢出菜单需要显示的选项
*/
overMenuItemList=new ArrayList<String>();
overMenuItemList.add("设置");
overMenuItemList.add("分享");
}
4、点击自定义溢出菜单弹出popupWindow
private void openSelfPopupWindow() {
View view=LayoutInflater.from(this).inflate(R.layout.popupwindow_over_flow_menu, null);
adapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, overMenuItemList);
list=(ListView) view.findViewById(R.id.pp_over_menu_list);
list.setAdapter(adapter);
PopupWindow popupWindow=new PopupWindow(view);
popupWindow.setWidth(LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true);
ColorDrawable background=new ColorDrawable();
popupWindow.setBackgroundDrawable(background);
popupWindow.setOutsideTouchable(true);
Rect rect=new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
popupWindow.showAtLocation(getWindow().getDecorView(), Gravity.TOP|Gravity.RIGHT, 15, rect.top+getActionBar().getHeight());
}
5、全部代码
package com.example.myselfproject.activity;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.example.myselfproject.R;
import android.app.Activity;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
public class MainActivity1 extends Activity{
private MenuItem overMenu;
private boolean isHasSamrtBar=false;
private List<String> overMenuItemList;
private ListView list;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setTitle("适配魅族");
isHasSamrtBar=hasSmartBar(); //判断是否有smartBar
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
overMenu=menu.findItem(R.id.overMenu);
overMenu.setVisible(false); //自定义溢出菜单暂不显示
if(isHasSamrtBar){
overMenu.setVisible(true);
dealMenuItem(menu);
}
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case R.id.it_progress:
break;
case R.id.overMenu:
/**
* 如果溢出菜单可以点击则显示弹出框
*/
openSelfPopupWindow();
break;
case R.id.it_setting:
break;
case R.id.it_share:
break;
default:
break;
}
return true;
}
/**
*
* @Title: openSelfPopupWindow
* @Description: TODO 显示自定义popupWindow
* @param
* @return void 返回类型
* @throws
*/
private void openSelfPopupWindow() {
View view=LayoutInflater.from(this).inflate(R.layout.popupwindow_over_flow_menu, null);
adapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, overMenuItemList);
list=(ListView) view.findViewById(R.id.pp_over_menu_list);
list.setAdapter(adapter);
list.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_MOVE){
return true;
}
return false;
}
});
PopupWindow popupWindow=new PopupWindow(view);
popupWindow.setWidth(LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true);
ColorDrawable background=new ColorDrawable();
popupWindow.setBackgroundDrawable(background);
popupWindow.setOutsideTouchable(true);
Rect rect=new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
popupWindow.showAtLocation(getWindow().getDecorView(), Gravity.TOP|Gravity.RIGHT, 15, rect.top+getActionBar().getHeight());
}
/**
*
* @Title: dealMenuItem
* @Description: TODO 对item进行处理
* @param @param menu
* @return void 返回类型
* @throws
*/
public void dealMenuItem(Menu menu){
/**
* 清空溢出菜单中的menuItem
*/
menu.removeItem(R.id.it_setting);
menu.removeItem(R.id.it_share);
/**
* 添加自定义溢出菜单需要显示的选项
*/
overMenuItemList=new ArrayList<String>();
overMenuItemList.add("设置");
overMenuItemList.add("分享");
}
public boolean hasSmartBar(){
try {
// 新型号可用反射调用Build.hasSmartBar()
Method method = Class.forName("android.os.Build").getMethod("hasSmartBar");
return ((Boolean) method.invoke(null)).booleanValue();
} catch (Exception e) {
}
// 反射不到Build.hasSmartBar(),则用Build.DEVICE判断
if (Build.DEVICE.equals("mx2")) {
return true;
} else if (Build.DEVICE.equals("mx") || Build.DEVICE.equals("m9")) {
return false;
}
return false;
}
}
6、popupWindow布局文件popupwindow_over_flow_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#EEEEEE">
<ListView
android:id="@+id/pp_over_menu_list"
android:layout_width="220dp"
android:layout_height="wrap_content"></ListView>
</LinearLayout>