android監聽虛擬按鍵的顯示與隱藏
阿新 • • 發佈:2018-11-10
虛擬按鍵在華為手機中大量存在,而虛擬按鍵的存在無疑增加了螢幕適配的難度,往往許多時候我們的介面需要根據虛擬按鍵的顯示與否(虛擬按鍵的顯示隱藏是使用者可以動態調整的)來調整介面的ui顯示,但android系統本身(似乎)並沒有提供此類介面(PS:反正我沒找到類似介面),經過研究得到一個可用的方式。
android手機介面分為SystemUi【包括status bar(狀態列)以及navigation bar(導航欄/虛擬按鍵)】和content,在android系統中content的id是 android.R.id.content,所以思路就是通過監聽content佈局的改變來間接監聽虛擬按鍵的顯示與隱藏;
其他的activity繼承該activity即可。
具體程式碼如下:
public class BaseActivityForAuto extends Activity implements ViewTreeObserver.OnGlobalLayoutListener { FrameLayout content; private static final String TAG = "BaseActivityForAuto"; private boolean mLayoutComplete = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); content = (FrameLayout) findViewById(android.R.id.content); content.post(new Runnable() { @Override public void run() { mLayoutComplete = true; Log.e(TAG, "content 佈局完成"); } }); content.getViewTreeObserver().addOnGlobalLayoutListener(this); } @Override protected void onPause() { super.onPause(); Log.e(TAG, "super.onPause();"); } @Override protected void onResume() { super.onResume(); Log.e(TAG, "super.onResume();"); } @Override public void onGlobalLayout() { Log.e(TAG, "onGlobalLayout"); if (!mLayoutComplete) return; onNavigationBarStatusChanged(); } protected void onNavigationBarStatusChanged() { // 子類重寫該方法,實現自己的邏輯即可。 } @Override protected void onDestroy () { super.onDestroy(); content.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }
參考1:https://blog.csdn.net/guolin_blog/article/details/51763825
參考2:https://blog.csdn.net/dliyuedong/article/details/49360807