本人第一次写博客,没什么技术含量,还请多多包涵,对于我们Android开发,有一种事情特别棘手,就是不知道如何监听导航键的隐藏和显示,我在平时开发中碰到过这种问题,想了很久,终于解决这个问题,经过在华为手机上测试,是可以行得通,其它手机你们自行测试一下。
示例代码是基于竖直屏幕,android:screenOrientation=“portrait”。横屏也是类似的。废话不多说,直接贴出代码。
首先先定义一个基础的BaseActivity,后续的Activity都继承BaseActivity即可。
package com.example.listennavigationshowhidedemo;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.view.Display;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.Window;
import android.view.WindowManager;
/**
*
* @author wuguoqiong
*
*/
public abstract class BaseActivity extends Activity implements OnGlobalLayoutListener{
private static boolean isNavigationShow = true;//默认为显示
private static int count = 0;//用于记录第一次导航键是隐藏还是显示
private ViewGroup activityRootView;//根视图 ContnetView
protected boolean mLayoutComplete;//这个标志用于监听布局是否绘制完成
private int iHeight;//屏幕高度
private int iWidth;//屏幕宽度
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN|WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
//初始化布局
initView();
//初始化数据
initData();
activityRootView = (ViewGroup) findViewById(android.R.id.content);
activityRootView.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mLayoutComplete = true;//这个标志用于监听布局是否绘制完成
}
});
}
public void onGlobalLayout()
if(!mLayoutComplete){
return;
}
if(count==0){//第一次用于判断显示导航键或者隐藏导航键
if(isNavigationBarShow(this)){
isNavigationShow = true;//显示导航键
onNavigationBarShowHide(isNavigationShow);//抽象方法
iHeight = PhoneHeightAndWidthUtil.getHasVirtualKey(this);//有导航键时的高度
SysConfig.setDeviceHeight(iHeight);//全局记录高度
}else{
isNavigationShow = false;//隐藏导航键
onNavigationBarShowHide(isNavigationShow);
iHeight = PhoneHeightAndWidthUtil.getNoHasVirtualKey(this);//没有导航键时的高度
SysConfig.setDeviceHeight(iHeight);
}
iWidth = PhoneHeightAndWidthUtil.getPhoneWidth(this);//因为基于竖屏所以屏幕宽度永远也不会变化
SysConfig.setDeviceWidth(iWidth);
}else{
if(isNavigationShow){//第一次以后
if(isNavigationBarShow(this)){
}else{//如果上一次是显示导航栏,下一次如果和上一次状态不同,才能判断是隐藏
isNavigationShow = false;
onNavigationBarShowHide(isNavigationShow);//每个子类Activity都会接受到这个方法
iHeight = PhoneHeightAndWidthUtil.getNoHasVirtualKey(this);
SysConfig.setDeviceHeight(iHeight);
}
}else{
if(isNavigationBarShow(this)){//如果上一次是隐藏导航栏,下一次如果和上一次状态不同,才能判断是显示
isNavigationShow = true;
onNavigationBarShowHide(isNavigationShow);//每个子类Activity都会接受到这个方法
iHeight = PhoneHeightAndWidthUtil.getHasVirtualKey(this);
SysConfig.setDeviceHeight(iHeight);
}else{
}
}
}
count++;//每次快执行完Count++一下
};
@SuppressLint("NewApi")
private boolean isNavigationBarShow(Activity baseActivity) {
// TODO Auto-generated method stub
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
Display display = baseActivity.getWindowManager().getDefaultDisplay();
Point size = new Point();
Point realSize = new Point();
display.getSize(size);
display.getRealSize(realSize);
boolean result = realSize.y != size.y;
return result;
}else{
boolean menu = ViewConfiguration.get(baseActivity).hasPermanentMenuKey();
boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
if(menu||back){
return false;
}else{
return true;
}
}
}
//导航栏的显示与隐藏监听
public abstract void onNavigationBarShowHide(boolean show_hide);
//初始化布局
public abstract void initView();
//初始化数据
public abstract void initData();
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
@SuppressLint("NewApi")
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();//注销全局监听器
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
activityRootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
activityRootView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);//一定要注册全局监听器
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
然后贴上MainActivity代码:
package com.example.listennavigationshowhidedemo;
import android.widget.Toast;
public class MainActivity extends BaseActivity {
@Override
public void initView() {
// TODO Auto-generated method stub
setContentView(R.layout.activity_main);
}
@Override
public void initData() {
// TODO Auto-generated method stub
}
@Override
public void onNavigationBarShowHide(boolean show_hide) {
// TODO Auto-generated method stub
String temp = show_hide==true?"导航键显示了":"导航键隐藏了";
Toast.makeText(this, temp, Toast.LENGTH_SHORT).show();
}
}
示例代码链接: https://pan.baidu.com/s/1ykZnEJ76RunuwVjP-tRnXw 提取码: an7w
至此大功告成!!!