1. 程式人生 > >隱藏底部虛擬鍵NavigationBar實現全屏

隱藏底部虛擬鍵NavigationBar實現全屏


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener {
	View main;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		main = getLayoutInflater().inflate(R.layout.activity_main, null);
		main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
		main.setOnClickListener(this);
		setContentView(main);

	}

	@Override
	public void onClick(View v) {
		int i = main.getSystemUiVisibility();
		if (i == View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) {//2
			main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
		} else if (i == View.SYSTEM_UI_FLAG_VISIBLE) {//0
			main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
		} else if (i == View.SYSTEM_UI_FLAG_LOW_PROFILE) {//1
			main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
		}
	}
}



Android 檢查裝置是否存在 導航欄 NavigationBar
目前也沒有可靠的方法來檢查裝置上是否有導航欄。可以使用KeyCharacterMap.deviceHasKey來檢查裝置上是否有某些物理鍵,比如說選單鍵、返回鍵、Home鍵。然後我們可以通過存在物理鍵與否來判斷是否有NavigationBar(一般來說手機上物理鍵、NavigationBar共存).

public static int getNavigationBarHeight(Activity activity) {
		Resources resources = activity.getResources();
		int resourceId = resources.getIdentifier("navigation_bar_height",
				"dimen", "android");
		//獲取NavigationBar的高度
		int height = resources.getDimensionPixelSize(resourceId);
		return height;
	}

上面這段程式碼,在絕大多數情況下都能獲取到NavigationBar的高度。所以有人想通過這個高度來判斷是否有NavigationBar 是不行的。當然4.0版本以下就不用說了。確認個問題,NavigationBar是4.0以上才有麼?
因為裝置有物理鍵仍然可以有一個導航欄。任何裝置執行自定義rom時都會設定一個選項,是否禁用的物理鍵,並新增一個導航欄。看看API:
ViewConfiguration.get(Context context).hasPermanentMenuKey()  有這麼一句描述 :Report if the device has a permanent menu key available to the user(報告如果裝置有一個永久的選單主要提供給使用者).


android.view.KeyCharacterMap.deviceHasKey(int keyCode) 的描述:Queries the framework about whether any physical keys exist on the any keyboard attached to the device that are capable of producing the given key code(查詢框架是否存在任何物理鍵盤的任何鍵盤連線到裝置生產給出關鍵程式碼的能力。).

那麼解決的辦法就是:

@SuppressLint("NewApi") 
	public static boolean checkDeviceHasNavigationBar(Context activity) {

		//通過判斷裝置是否有返回鍵、選單鍵(不是虛擬鍵,是手機螢幕外的按鍵)來確定是否有navigation bar
		boolean hasMenuKey = ViewConfiguration.get(activity)
				.hasPermanentMenuKey();
		boolean hasBackKey = KeyCharacterMap
				.deviceHasKey(KeyEvent.KEYCODE_BACK);

		if (!hasMenuKey && !hasBackKey) {
			// 做任何你需要做的,這個裝置有一個導航欄
			return true;
		}
		return false;
	}


http://blog.csdn.net/lnb333666/article/details/41821149

在 KitKat以上版本中使用Translucent將Navigation Bar透明化
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0616/3052.html

為Android4.4以上系統的狀態列和導航欄填充顏色
https://github.com/jgilfelt/SystemBarTint

Android狀態列合集-管你透不透明
http://www.open-open.com/lib/view/open1468204363687.html

Android狀態列微技巧,帶你真正理解沉浸式模式
http://www.open-open.com/lib/view/open1472112617427.html

Android5.0之Toolbar詳解
http://www.open-open.com/lib/view/open1484918068393.html