1. 程式人生 > >android 關於軟鍵盤的一些問題記錄

android 關於軟鍵盤的一些問題記錄

專案中有一個需求,類似小紅書app筆記評論,實現的效果如下(勉強可以看清吧)
這裡寫圖片描述

點選評論檢視外部,隱藏評論檢視並關閉軟鍵盤

在activity的dispatchTouchEvent

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            //inputMethodShowing為定義的軟鍵盤開啟的標誌
            if (inputMethodShowing && isOutBottomLayout(ev)) {
                hideInputMethod();
                return
true; } } return super.dispatchTouchEvent(ev); }

判斷touch事件是否在評論檢視外

public boolean isOutBottomLayout(MotionEvent event) {
        if (bottom_layout != null) {
            int[] leftTop = {0, 0};
            //獲取bottomlayout當前的location位置
            bottom_layout.getLocationInWindow(leftTop);
            int
left = leftTop[0]; int top = leftTop[1]; int bottom = top + bottom_layout.getHeight(); int right = left + bottom_layout.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event
.getY() < bottom) { // 點選在bottomlayout內,保留事件 return false; } else { return true; } } return false; }

點選返回鍵或點選輸入法上的收起軟鍵盤按鈕,關閉軟鍵盤並隱藏評論檢視

羅昇陽前輩相關部落格:https://blog.csdn.net/luoshengyang/article/details/6882903
當軟鍵盤開啟時,第一次點選返回鍵,不會走onBackPress和onKeyDown方法,會關閉軟鍵盤,當第二次點選返回鍵時才會呼叫,原因時,當點選返回鍵時,會先呼叫view的dispatchKeyEventPreIme方法,在把返回事件傳遞給輸入法處理之前先派發給dispachKeyEventPreIme方法,當其不進行處理時,才會交給輸入法處理,輸入法處理會關閉軟鍵盤,進而事件被消費不再往下傳遞。
通過dispatchKeyEventPreIme方法監聽返回鍵(如果有輸入法存在,那麼按鍵訊息首先會被派發到輸入法視窗,如果想在輸入法截獲訊息之前處理該訊息,那麼可以過載該函式)
關於此方法可參考:https://blog.csdn.net/zjmdp/article/details/7706520
https://blog.csdn.net/siobhan/article/details/8268543
這個方法可以在軟鍵盤開啟狀態時監聽到返回鍵的,可以做自己的一些處理
但是,這個方法只能監聽到返回鍵,想要的效果是當軟鍵盤隱藏時,底部的評論檢視就隱藏,就忽略了一種情況:當點選軟鍵盤上的“v”隱藏軟鍵盤按鍵時,底部的評論檢視還是沒有隱藏掉,所以只能作罷,再找其它的方法。

public class SoftKeyboardSizeWatchLayout extends ConstraintLayout {
    public SoftKeyboardSizeWatchLayout(Context context) {
        super(context);
    }

    public SoftKeyboardSizeWatchLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public SoftKeyboardSizeWatchLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public interface OnResizeListener {
        void onResize();
    }

    private OnResizeListener onResizeListener;

    public void setOnResizeListener(OnResizeListener onResizeListener) {
        this.onResizeListener = onResizeListener;
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            if (onResizeListener != null) {
                onResizeListener.onResize();
            }
            return true;
        }
        return super.dispatchKeyEventPreIme(event);
    }
}

OnGlobalLayoutListener

bottom_layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //獲取當前視窗可視區域大小
                final Rect rect = new Rect();
                getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
                int visibleHeight = rect.height();
                if (rootViewVisibleHeight == 0) {
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }
                //根檢視顯示高度沒有變化,可以看作軟鍵盤顯示/隱藏狀態沒有改變
                if (rootViewVisibleHeight == visibleHeight) {
                    return;
                }
                //根檢視顯示高度變小超過200,可以看作軟鍵盤顯示了
                if (rootViewVisibleHeight - visibleHeight > 200) {
                    //監聽軟鍵盤彈出的一些操作
                    // ......
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }
                //根檢視顯示高度變大超過200,可以看作軟鍵盤隱藏了
                if (visibleHeight - rootViewVisibleHeight > 200) {
                    //監聽軟鍵盤隱藏的一些操作
                    // ......
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }
            }
        });

相關推薦

Android鍵盤狀態的切換及其強制隱藏

padding protected systems -m ride apk undle inb new MainActivity例如以下: package cc.c; import android.os.Bundle; import android.view.View

求助aNDROID鍵盤問題

軟鍵盤 hao123 com baidu 鍵盤 5% list ongl oid %E6%80%A5%E6%B1%82%7E%7E%E5%AF%B9%E5%A4%A7%E5%9B%BE%E7%89%87%E8%BF%9B%E8%A1%8C%E8%B0%83%E8%89%B2

移動端Android鍵盤遮住輸入框解決!

res set pan area app tar span lac row 在使用vue的情況下,在輸入框中添加 <textarea class="textarea" @click="isAndroid" :maxlength="30" :rows="1" plac

Android 鍵盤的顯示和隱藏,這樣操作就對了

ide min 影響 想要 manage 總結 ice 技術 3.1 一、前言 如果有需要用到輸入的地方,通常會有需要自動彈出或者收起軟鍵盤的需求。開篇明義,本文會講講彈出和收起軟鍵盤的一些細節,最終還會從源碼進行分析。 想要操作軟鍵盤,需要使用到 InputMethod

Android鍵盤彈出,覆蓋h5頁面輸入框問題

問題 過多 繼承 col 鍵盤 代碼 chrom 技術 fff 之前我們在使用vue進行 h5 表單錄入的過程中,遇到了Android軟鍵盤彈出,覆蓋 h5頁面 輸入框 問題,在此進行回顧並分享給大家: 系統:Android 條件:當輸入框在可視區底部或者偏下的位置 觸發

Android鍵盤監聽KeyboardWatcher

轉載請標明出處:http://blog.csdn.net/wu_wxc/article/details/53705322 本文出自【吳孝城的CSDN部落格】 在如登入介面上當輸入框獲得焦點時,為了將輸入框顯示出來,不被軟鍵盤遮住,我們可以監聽軟鍵盤的顯示與關閉來實現

關於Android鍵盤遮擋的問題

在開發登入介面時,點選某個EditText準備輸入,彈出的軟鍵盤遮擋了按鈕或者下面的輸入框,在完成這個文字框的輸入後,想要繼續下面的操作,需要先隱藏軟鍵盤。這會影響使用者操作的流暢感,所以需要解決。 問題如下: image.png 解決方法 監聽佈局變化,當軟鍵盤彈出時,滾

android 鍵盤彈出 佈局上移動

這是軟體盤和actiivty主視窗搶空間造成的,需在AndroidManifest.xml裡為activity配置windowSoftInputMode屬性併為其選擇屬性值。 如下: <activity android:name="...Activity" a

Android鍵盤彈出,介面整體上移終極解決方式

今天在應測試要求:軟鍵盤彈出不能遮擋EditView,在網上找了各種方案,基本都不行,比如: android:windowSoftInputMode=“adjustResize|stateHidden” 可能在一般的頁面是可以用吧。 下面來說一個曲線救國的方案,

Android 鍵盤踩坑記

最近在開發一個朋友圈產品的時候遇到一個bug:軟鍵盤遮罩,在解決的過程中我通過百度、谷歌查找了好半天,最終經歷了一番坎坷才解決,具體過程且聽我娓娓道來! 一、windowSoftInputMode 這個是在遇到軟鍵盤相關的問題,腦子裡第一個想到的知識點,但是效果如何呢?能解決問題,但是不完美! 先看沒有解

Android鍵盤的隱藏顯示研究

原文地址 http://winuxxan.blog.51cto.com/2779763/522810   Android是一個針對觸控式螢幕專門設計的作業系統,當點選編輯框,系統自動為使用者彈出軟鍵盤,以便使用者進行輸入。     那麼,彈出軟鍵盤後必然會造成原有佈局

Android鍵盤遮擋的四種解決方案

問題概述 在編輯框輸入內容時會彈出軟鍵盤,而手機螢幕區域有限往往會遮住輸入介面,我們先看一下問題效果圖: 輸入使用者名稱和密碼時,系統會彈出鍵盤,造成系統鍵盤會擋住文字框的問題,如圖所示: 輸入密碼時輸入框被系統鍵盤遮擋了,大大降低了使用者操作體驗,這就是開發中非常常見的軟鍵盤遮擋的問題,

android 鍵盤管理

package com.dejun.commonsdk.util; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.gr

Android 鍵盤按鍵監控

最近在做專案,遇到一個比較頭疼的問題,問題是需要對使用者的輸入進行時時監聽,而大部分使用者的輸入是通過軟鍵盤來完成的,而Android平臺好象沒有專門的對此監控事件,那該怎麼辦呢? 最終解決辦法就是通過EditText和TextWatcher類來輔助監聽。具體做法如下

Android 鍵盤原理 鍵盤彈出時與介面的互動

本文轉載於http://hkp.iteye.com/blog/1205492、http://blog.sina.com.cn/s/blog_6a156a1b0101547k.html,講述Android軟鍵盤原理,及彈出時與介面的互動方式。軟鍵盤的本質是什麼?軟鍵盤其實是一個

android鍵盤右下角按鍵設定

預設情況,鍵盤右下角為Enter鍵。EditText提供了android:imeOptions屬性,控制該文字顯示。1、android:imeOptions="actionSearch" 文字為搜尋2、android:imeOptions="actionGo" 文字為開始3

Android 鍵盤遮擋PopupWindow解決辦法

專案需要實現評論的功能,因此我使用了popupWindow作為彈出框,其中包含了一個edittext。但是發現軟鍵盤會遮擋一部分popupWindow,而實際上得到的效果應該是軟鍵盤將 整個popupWindow頂上去,後來通過查詢api,發現通過: //設定彈出窗體需要

android鍵盤擋住輸入框

最近遇到了軟鍵盤擋住輸入框的問題,上網蒐羅半天,找到了一篇針對這個問題講的比較全(好)的文章,地址放在下面:https://www.diycode.cc/topics/383 自己的收穫: 普通Activity(不帶WebView),直接在manifest檔案中對acti

Android 鍵盤之 windowSoftInputMode 分析

Android 軟鍵盤彈出可能會遮擋住介面上的 EditText 或者是其他控制元件,有時還會出現莫名其妙的問題,解決軟鍵盤問題,先從 windowSoftInputMode 入手。windowSoftInputMode 常用的有 adjustPan,adjustResize

Android鍵盤遮擋問題解決

在開發登入介面時,在點選某個EditText準備輸入時,彈出的軟鍵盤遮擋了按鈕或者下面的輸入框,在完成這個文字框的輸入後,想要繼續下面的操作,需要先隱藏軟鍵盤。這會影響使用者操作的流暢感,所以需要解決。在嘗試了網上的幾種處理方法後,最終選擇了一種比較滿意的方式。