1. 程式人生 > >聊天記錄,踩的坑:設定EditText焦點;EditText軟鍵盤和recyclerview的互動;SpannableStringBuilder的使用;ClickableSpan失效;軟鍵盤擋住edi

聊天記錄,踩的坑:設定EditText焦點;EditText軟鍵盤和recyclerview的互動;SpannableStringBuilder的使用;ClickableSpan失效;軟鍵盤擋住edi

效果概述:

  • 模仿QQ聊天記錄

效果圖如下:

模擬器只有逍遙安卓了,實在不想重走genymotion的坑,但是逍遙沒法彈出軟鍵盤,就這麼看吧,可以下載原始碼在手機上執行,就可以看出來了。
這裡寫圖片描述

遇到的問題(一)設定EditText焦點

 我想實現點選進去EditText並不獲取焦點,而是手動點選的時候獲取到焦點,鍵盤彈出

這個實現倒不難,在EditText的父控制元件上加上這樣兩行程式碼即可

        android:focusable="true"
        android:focusableInTouchMode="true"

遇到的問題(二)EditText軟鍵盤和recyclerview的互動

 我想實現(1)軟鍵盤彈出,recyclerview自動調整佈局,即將最後一條顯示於軟鍵盤之上
        (2)軟鍵盤彈出的前提下,傳送訊息後,recyclerview再次調整佈局,將傳送的訊息顯示於軟鍵盤之上

這個問題折磨我好久,網上找出各種示例都不成功。
so,我把我的最後的解決辦法丟擲來,能不能解決你的問題那就看緣分啦

  1. 首先Manifests檔案中此activity加入如下程式碼;這是當彈出軟鍵盤的時候,自動調整佈局。網上有詳細解釋,我就不多說了。

        <activity
            android:windowSoftInputMode="adjustResize|stateAlwaysHidden"
    android:name=".MainActivity">
  2. 其次監聽軟鍵盤;當軟鍵盤彈出的時候,讓RecyclerView滑動到最後一個位置

        layout = (RelativeLayout) findViewById(R.id.activity_main);
         ViewTreeObserver observer = layout.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
    public void onGlobalLayout() { Rect rect = new Rect(); layout.getWindowVisibleDisplayFrame(rect); int screenHeight=layout.getRootView().getHeight();//獲取螢幕高度 int heightDiff=screenHeight-(rect.bottom-rect.top);//獲取高度之差 Log.e("自定義標籤", screenHeight+"_____________"+heightDiff+"");//heightDiff 48--568 if (heightDiff>50){//50是因為我設定的editText高度為40,這個數值可以隨時調整的 //此時軟鍵盤彈出 recycler.scrollToPosition(MyAdapter.list.size()-1); } } });

    ViewTreeObserver是主佈局獲取的佈局樹,通過佈局樹監聽整個螢幕高度的動態改變

  3. 最後當傳送訊息的時候,讓RecyclerView滑動到最後一個位置

    public void send(View view){
        String s = et.getText().toString();
        adapter.add("right_"+s);
        adapter.add("left_");
        et.setText("");
        recycler.scrollToPosition(MyAdapter.list.size()-1);
    }

遇到的問題(三)SpannableStringBuilder的使用

想實現如圖所示,客服回覆的內容是一個TextView,帶有點選事件,帶有顏色和下劃線

這個倒也不難,網上教程很多啊

遇到的問題(四)ClickableSpan失效

總之,就是點選不成功,無效
 1. TextView的setText()方法必須放在setSpan()之後才有效
 2. 必須有txt.setMovementMethod(LinkMovementMethod.getInstance());//即設定可點選或者可實現的一個效果。但是我在搜尋這個的時候,發現有網友指出這個語句會導致listview的setOnItemClickListener 事件失效,如果真碰到了可以參考連結 http://blog.csdn.net/yang19910524/article/details/50988028
 3. 還不對的話,仍然不對的話,檢查一下你的TextView的setText()方法傳遞進去的,應該是,SpannableStringBuilder或者SpannableString本身,而不是  .toString() 【QAQ】

遇到的問題(五)沉浸式狀態列,EditText在底部,軟鍵盤的彈出擋住了EditText

如描述所說,沉浸式狀態列,EditText在底部,EditText獲取焦點後彈出軟鍵盤,但是軟鍵盤擋住了EditText

我在網上搜索相關的訊息,據知乎上有個網友解釋這是一個bug,系統級未修復。
我的解決辦法是,棄用官方的沉浸式狀態列的標準程式碼(很簡單啊可惜可惜),改用第三方庫SystemBarTint。
CSDN上有個博主有SystemBarTint的詳細介紹,可以參考下。 http://blog.csdn.net/hwe_xc/article/details/50553758

核心程式碼

核心程式碼就不貼啦,坑解決了就沒啥難點了。已經把程式碼貼到github上了。

實現原始碼