快速解決Android適配底部返回鍵等虛擬鍵盤的問題
這個問題來來回回困擾了我很久,一直沒能妥善解決。
場景1:華為手機(jī)遮擋了屏幕底部。
場景2:進(jìn)入應(yīng)用時,虛擬鍵自動縮回,留下空白區(qū)域。
需求:
需要安卓能自適應(yīng)底部虛擬按鍵,用戶隱藏虛擬按鍵時應(yīng)用要占滿整個屏幕,當(dāng)用戶啟用虛擬鍵時,應(yīng)用能往上收縮,等于是被底部虛擬按鍵頂上來。
需求很簡單,實現(xiàn)起來卻困難重重。
完美解決方案:
解釋一下下面的代碼,就是監(jiān)聽某個視圖的變化,當(dāng)可以看見的高度發(fā)生變化時,就對這個視圖重新布局,保證視圖不會被遮擋,也不會浪費屏幕空間。這一點尤其可用在像華為手機(jī)等可以隱藏和顯示虛擬鍵盤上導(dǎo)致屏幕變化的手機(jī)上。
首先添加工具類AndroidBug54971Workaround
package com.xxxx.xxxx;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
/**
* Created by win7 on 2016/12/14.
*/
public class AndroidBug54971Workaround {
// For more information, see https://code.google.com/p/android/issues/detail?id=5497
// To use this class, simply invoke assistActivity() on an Activity that already has its content view set.
/**
* 關(guān)聯(lián)要監(jiān)聽的視圖
*
* @param viewObserving
*/
public static void assistActivity(View viewObserving) {
new AndroidBug54971Workaround(viewObserving);
}
private View mViewObserved;//被監(jiān)聽的視圖
private int usableHeightPrevious;//視圖變化前的可用高度
private ViewGroup.LayoutParams frameLayoutParams;
private AndroidBug54971Workaround(View viewObserving) {
mViewObserved = viewObserving;
//給View添加全局的布局監(jiān)聽器
mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
resetLayoutByUsableHeight(computeUsableHeight());
}
});
frameLayoutParams = mViewObserved.getLayoutParams();
}
private void resetLayoutByUsableHeight(int usableHeightNow) {
//比較布局變化前后的View的可用高度
if (usableHeightNow != usableHeightPrevious) {
//如果兩次高度不一致
//將當(dāng)前的View的可用高度設(shè)置成View的實際高度
frameLayoutParams.height = usableHeightNow;
mViewObserved.requestLayout();//請求重新布局
usableHeightPrevious = usableHeightNow;
}
}
/**
* 計算視圖可視高度
*
* @return
*/
private int computeUsableHeight() {
Rect r = new Rect();
mViewObserved.getWindowVisibleDisplayFrame(r);
return (r.bottom - r.top);
}
}
然后在你需要解決這個問題的Activity的onCreate方法的setContentView(R.layout.content_frame);后面添加上
setContentView(R.layout.content_frame); AndroidBug54971Workaround.assistActivity(findViewById(android.R.id.content));
如果你看的懂代碼,你肯定知道assistActivity方法里放入的View是你 要調(diào)整高度的視圖。
其他不完美方案:或多或少在某些情況上會起不到作用
我一種方法:
android:fitsSystemWindows=”true”
這句話寫在layout的根目錄下,看名字就知道是自適應(yīng)系統(tǒng)窗口。估計能解決很大一部分手機(jī)了,可是在同事的nexus 4下并沒有什么用。
第二種方法:
我去掉了每個布局的android:fitsSystemWindows=”true”
在style文件中添加了這句話。
<item name="android:windowTranslucentNavigation">false</item>
注意: 你會發(fā)現(xiàn)系統(tǒng)報錯,這是因為這句話是在API-19后才有的,所以你可以復(fù)制你的style文件,把它放到API-19的文件夾下。這樣的用途就是如果手機(jī)大于等于API19,就會用API-19的文件夾下的內(nèi)容。否則用原來的style文件。你在API19文件夾下的style文件的根主題中添加上面這句話就OK啦。
本來我以為是完美解決了我的問題。可是被打臉了。剛進(jìn)入App時會出現(xiàn)上面的場景2的情況。
我一看MainActivity中的onCreate方法的setContentView(R.layout.xxxx);之前有下面的代碼
//控制底部虛擬鍵盤
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
// | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
估計是這個項目以前的仁兄為了解決這個問題添加的。
經(jīng)過多次調(diào)試,我添加了一句話
//控制底部虛擬鍵盤
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
// | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
場景2的情況解決了。這是在虛擬鍵一直存在的情況下沒有問題了,因為nexus不能手動隱藏虛擬鍵盤,所以我也不清楚是否能在華為等手機(jī)上正常運(yùn)行。TODO。
另外如果想要一直隱藏虛擬鍵盤,點擊屏幕也不會出現(xiàn)的話,將上面的代碼換成:
//讓虛擬鍵盤一直不顯示 Window window = getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE; window.setAttributes(params);
以上這篇快速解決Android適配底部返回鍵等虛擬鍵盤的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android切換前后臺點擊通知進(jìn)入當(dāng)前頁面
這篇文章主要介紹了Android切換前后臺點擊通知進(jìn)入當(dāng)前頁面,主要講述當(dāng)App退出到后臺的后,怎么點擊通知回到原來按下HOME鍵之前的前臺頁面,需要的朋友可以參考下2023-03-03
Android編程基于自定義控件實現(xiàn)時鐘功能的方法
這篇文章主要介紹了Android編程基于自定義控件實現(xiàn)時鐘功能的方法,結(jié)合實例形式詳細(xì)分析了Android自定義控件的定義及時鐘功能相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-03-03
Android關(guān)于WebView中無法定位的問題解決
本篇文章主要介紹了Android關(guān)于WebView中無法定位的問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Android開發(fā)方式之Java+html+javascript混合開發(fā)
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)方式的其中一種Java+html+javascript混合開發(fā),感興趣的小伙伴們可以參考一下2016-06-06
簡單介紹Android開發(fā)中的Activity控件的基本概念
這篇文章主要介紹了Android開發(fā)中的Activity控件的基本概念,Activity控件的使用是安卓開發(fā)的基礎(chǔ)之一,需要的朋友可以參考下2015-12-12
Android編程實現(xiàn)定時發(fā)短信功能示例
這篇文章主要介紹了Android編程實現(xiàn)定時發(fā)短信功能,結(jié)合實例形式較為詳細(xì)的分析了Android定時發(fā)送短信功能的相關(guān)原理、實現(xiàn)方法與注意事項,需要的朋友可以參考下2017-09-09

