actionBar适配魅族smartBar

来源:互联网 发布:php网站源码 编辑:程序博客网 时间:2024/06/07 03:02

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>

0 0
原创粉丝点击