android 监听虚拟按键的显示与隐藏实战代码

本人第一次写博客,没什么技术含量,还请多多包涵,对于我们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

至此大功告成!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值