91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何使用Android實現一個懸浮在軟鍵盤上的輸入欄

發布時間:2022-04-11 14:27:06 來源:億速云 閱讀:921 作者:iii 欄目:開發技術

這篇文章主要介紹“如何使用Android實現一個懸浮在軟鍵盤上的輸入欄”,在日常操作中,相信很多人在如何使用Android實現一個懸浮在軟鍵盤上的輸入欄問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用Android實現一個懸浮在軟鍵盤上的輸入欄”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    懸浮欄

    實現懸浮欄很簡單

    chatInputPanel.setVisibility(View.VISIBLE);
    chatInputEt.setFocusable(true);
    chatInputEt.setFocusableInTouchMode(true);
    chatInputEt.requestFocus();
    InputMethodManager inputManager = (InputMethodManager)chatInputEt.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.showSoftInput(chatInputEt, 0);

    chatInputPanel就是懸浮欄整個layout,mChatPanelContent才是懸浮欄實際部分,chatInputEt是其中的EditText,對它做一些設置就可以實現將chatInputPanel懸浮在軟件盤上。

    這里chatInputPanel是全屏的(點擊mChatPanelContent以外部分隱藏鍵盤),mChatPanelContent是在它的bottom底部,默認隱藏(INVISIBLE)。

    橫屏時軟鍵盤全屏

    橫屏時,安卓默認會將軟鍵盤全屏顯示,這樣無法實現懸浮欄。所以需要取消全屏顯示

    在EditText中使用android:imeOptinos可對Android自帶的軟鍵盤進行一些界面上的設置

    • android:imeOptions="flagNoExtractUi" //使軟鍵盤不全屏顯示,只占用一部分屏幕

    • android:imeOptions="actionNone" //輸入框右側不帶任何提示

    • android:imeOptions="actionGo" //右下角按鍵內容為'開始'

    • android:imeOptions="actionSearch" //右下角按鍵為放大鏡圖片,搜索

    • android:imeOptions="actionSend" //右下角按鍵內容為'發送'

    • android:imeOptions="actionNext" //右下角按鍵內容為'下一步'

    • android:imeOptions="actionDone" //右下角按鍵內容為'完成'

    所以我們為EditText設置android:imeOptions="flagNoExtractUi"即可實現在橫屏時不全屏顯示。同時,可能EditText添加相應的監聽器,捕捉用戶點擊了軟鍵盤右下角按鈕的監聽事件,以便進行處理。

    editText.setOnEditorActionListener(new OnEditorActionListener() {   
            @Override  
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {   
                Toast.makeText(MainActivity.this, "text2", Toast.LENGTH_SHORT).show();   
                return false;   
            }   
        });

    監聽軟鍵盤(該方法不可靠,廢棄,下面有靠譜的)

    注意:這是網上的一個錯誤方法,所以特意拿出來說一下,不感興趣直接去看(3)即可。

    顯示沒問題了,但是軟鍵盤隱藏的時候要求懸浮欄同步隱藏起來。

    系統并沒有提供監聽軟鍵盤收起的api,所以我們只能自己實現。

    chatInputPanel.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if(chatInputPanel.getBottom() > container.getRootView().getHeight() / 2){
                chatInputPanel.setVisibility(View.INVISIBLE);
            }
            else{
                chatInputPanel.setVisibility(View.VISIBLE);
            }
        }
    });

    監聽chatInputPanel(懸浮欄整體布局)的布局變化,當底部大于rootview高度一半的時候隱藏,否則顯示。

    因為我們的功能是橫屏的,所以鍵盤彈起時,chatInputPanel因為懸浮在鍵盤上,所以底部一定小于rootview高度(屏幕寬度)一半。

    當收起鍵盤,chatInputPanel會回到最底部(設置是在父布局底部),所以底部一定大于一半。

    這個方法不靠譜,而且重繪會導致onGlobalLayout頻繁的執行,雖然可以加上一個時間來控制,但是不推薦使用這個方式來監聽軟鍵盤,下面看看另外一種方式。

    靠譜的監聽軟鍵盤的方法

    上面的方法為什么不考慮,是因為全屏顯示FLAG_FULLSCREEN(隱藏通知欄)導致問題

    當我們需要全屏顯示隱藏通知欄時,會使用FLAG_FULLSCREEN屬性

    getActivity().getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    但是會影響上面的懸浮欄,因為發現chatInputPanel.getBottom()始終沒變化,但是我們判斷顯示隱藏就靠這個變化。

    沒變化是因為android在全屏FLAG_FULLSCREEN的處理方式導致的,全屏時軟鍵盤會出現很多問題,這個網上有很多。

    如何解決?

    我們換一種方式監聽軟鍵盤即可

    getActivity().getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);
            int rootHeight=rootView.getRootView().getHeight();
    
            int displayHeight=rect.height();
            int diffHeight=rootHeight-displayHeight;
            if(diffHeight==0){
                //鍵盤收起
                chatInputPanel.setVisibility(View.INVISIBLE);
            }else{
                //鍵盤彈出
                chatInputPanel.setVisibility(View.VISIBLE);
            }
        }
    });

    通過監聽根布局種的content布局的變化來判斷,目前這個方法是最靠譜的。

    但是還存在一個小問題,就是全屏狀態下鍵盤會覆蓋懸浮欄底部的一小部分,這個怎么辦?

    終極懸浮方式

    上面解決了軟鍵盤的監聽問題,但是全屏狀態下懸浮欄總會被遮住一部分,那怎么辦?

    其實這里還有一個問題,當顯示鍵盤后,app中的布局整體被向上推起,這樣導致部分組件縮小等情況。

    我們要首先解決這個問題,讓app的布局整體保持不動,鍵盤覆蓋在其上面,這需要在彈起鍵盤前手動設置一下,如下:

    mChatInput.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DisplayMetrics metric = new DisplayMetrics();
            getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
            chatInputPanel.setY(-metric.heightPixels);//解決首次可能向上推的問題
            
            chatInputEt.setFocusable(true);
            chatInputEt.setFocusableInTouchMode(true);
            chatInputEt.requestFocus();
            InputMethodManager inputManager = (InputMethodManager)chatInputEt.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.showSoftInput(chatInputEt, 0);
        }
    });

    這樣將懸浮欄移到了最頂部以上,就不會出現上推的情況了(猜測與鍵盤的機制有關,因為鍵盤彈出如果遮擋了有焦點的輸入組件就好重新調整窗口,我們將懸浮窗放在最上面,鍵盤怎么也不會遮擋到焦點的EditText,所以不會重新調整窗口)。

    但是這樣懸浮欄就一直看不見了,而且我們可以看到在這里去掉了chatInputPanel.setVisibility(View.VISIBLE);代碼,那么如何顯示?

    上面我們提到使用OnGlobalLayoutListener方式監聽鍵盤,我們就在這里顯示即可,同時優化一下顯示的位置,在這里計算窗口顯示區域上移多少,讓chatInputPanel也上移相應位置即可,如:

    private int mLastHeight = 0;
    getActivity().getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect rect = new Rect();
            getActivity().getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
            int height = rect.height();
            int rawHeight = getResources().getDisplayMetrics().heightPixels - rect.top;
            if (height == mLastHeight)
                return;
                
            if (height < rawHeight) {
                UiThreadHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        chatInputPanel.setVisibility(View.VISIBLE);
                        chatInputPanel.setTranslationY(-(rawHeight - height));
                    }
                }, 200);
            } else {
                UiThreadHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        chatInputPanel.setVisibility(View.GONE);
                    }
                }, 100);
            }
                    
            mLastHeight = height;    
        }
    });

    可以看到先得到當前窗口的顯示高度和屏幕的實際高度(窗口部分)

    然后先判斷窗口顯示區域是否變化了,如果沒變化則不處理。

    如果有變化,則判斷變大還是變小了。

    如果變小了

    說明鍵盤彈起,這時候顯示chatInputPanel,同時設置translationY為-(rawHeight - height)

    首先chatInputPanel初始位置底部是與屏幕底部對齊的,雖然設置了setY,但是setY實際上就是setTranslationY,初始位置沒變,源碼:

    public void setY(float y) {
        setTranslationY(y - mTop);
    }

    而彈起鍵盤后想要顯示在鍵盤以上,那么就需要從最底部向上移動一個鍵盤的高度,鍵盤高度就是rawHeight - height,所以向上移動是將translationY設置為-(rawHeight - height)。

    如果變大了

    說明鍵盤收起,隱藏chatInputPanel即可。

    這樣不僅解決了窗口推起的問題,也同時解決了軟鍵盤遮擋部分懸浮欄的問題,因為懸浮欄的位置是通過計算得到的,不是通過軟鍵盤上推導致布局調整而改變位置的。

    到此,關于“如何使用Android實現一個懸浮在軟鍵盤上的輸入欄”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

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

    AI

    朝阳市| 奉节县| 佛坪县| 邵武市| 宜春市| 乐亭县| 华宁县| 鞍山市| 天峻县| 铜梁县| 玛纳斯县| 兴山县| 新源县| 方城县| 巴楚县| 吴江市| 彭泽县| 太康县| 织金县| 六枝特区| 卓尼县| 汉阴县| 饶平县| 大邑县| 鹿邑县| 宁波市| 密云县| 丁青县| 荣成市| 鄂尔多斯市| 新宾| 增城市| 株洲县| 山西省| 德江县| 阜宁县| 屏东县| 屏南县| 高陵县| 西丰县| 景德镇市|