中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決Android適配底部返回鍵等虛擬鍵盤的問題

發布時間:2021-07-21 13:43:10 來源:億速云 閱讀:179 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關如何解決Android適配底部返回鍵等虛擬鍵盤的問題的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

場景1:華為手機遮擋了屏幕底部。

場景2:進入應用時,虛擬鍵自動縮回,留下空白區域。

需求:

需要安卓能自適應底部虛擬按鍵,用戶隱藏虛擬按鍵時應用要占滿整個屏幕,當用戶啟用虛擬鍵時,應用能往上收縮,等于是被底部虛擬按鍵頂上來。

需求很簡單,實現起來卻困難重重。

完美解決方案:

解釋一下下面的代碼,就是監聽某個視圖的變化,當可以看見的高度發生變化時,就對這個視圖重新布局,保證視圖不會被遮擋,也不會浪費屏幕空間。這一點尤其可用在像華為手機等可以隱藏和顯示虛擬鍵盤上導致屏幕變化的手機上。

首先添加工具類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.

 /**
  * 關聯要監聽的視圖
  *
  * @param viewObserving
  */
 public static void assistActivity(View viewObserving) {
  new AndroidBug54971Workaround(viewObserving);
 }

 private View mViewObserved;//被監聽的視圖
 private int usableHeightPrevious;//視圖變化前的可用高度
 private ViewGroup.LayoutParams frameLayoutParams;

 private AndroidBug54971Workaround(View viewObserving) {
  mViewObserved = viewObserving;
  //給View添加全局的布局監聽器
  mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
   public void onGlobalLayout() {
    resetLayoutByUsableHeight(computeUsableHeight());
   }
  });
  frameLayoutParams = mViewObserved.getLayoutParams();
 }

 private void resetLayoutByUsableHeight(int usableHeightNow) {
  //比較布局變化前后的View的可用高度
  if (usableHeightNow != usableHeightPrevious) {
   //如果兩次高度不一致
   //將當前的View的可用高度設置成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是你 要調整高度的視圖。

其他不完美方案:或多或少在某些情況上會起不到作用

我一種方法:

android:fitsSystemWindows=”true”

這句話寫在layout的根目錄下,看名字就知道是自適應系統窗口。估計能解決很大一部分手機了,可是在同事的nexus 4下并沒有什么用。

第二種方法:

我去掉了每個布局的android:fitsSystemWindows=”true”

在style文件中添加了這句話。

<item name="android:windowTranslucentNavigation">false</item>

注意: 你會發現系統報錯,這是因為這句話是在API-19后才有的,所以你可以復制你的style文件,把它放到API-19的文件夾下。這樣的用途就是如果手機大于等于API19,就會用API-19的文件夾下的內容。否則用原來的style文件。你在API19文件夾下的style文件的根主題中添加上面這句話就OK啦。

本來我以為是完美解決了我的問題。可是被打臉了。剛進入App時會出現上面的場景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);

估計是這個項目以前的仁兄為了解決這個問題添加的。

經過多次調試,我添加了一句話

  //控制底部虛擬鍵盤
  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不能手動隱藏虛擬鍵盤,所以我也不清楚是否能在華為等手機上正常運行。TODO。

另外如果想要一直隱藏虛擬鍵盤,點擊屏幕也不會出現的話,將上面的代碼換成:

  //讓虛擬鍵盤一直不顯示
  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適配底部返回鍵等虛擬鍵盤的問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安化县| 唐山市| 安顺市| 韶关市| 绥阳县| 班玛县| 华宁县| 定安县| 汉阴县| 沈丘县| 板桥市| 德清县| 宁南县| 长春市| 青田县| 阿拉尔市| 青州市| 陇川县| 出国| 太和县| 广饶县| 湖南省| 信丰县| 乐陵市| 闵行区| 图片| 曲水县| 五莲县| 康平县| 河间市| 宕昌县| 龙州县| 铜山县| 惠州市| 安达市| 都江堰市| 祁门县| 韩城市| 蒙阴县| 建水县| 邢台市|