聊天記錄,踩的坑:設定EditText焦點;EditText軟鍵盤和recyclerview的互動;SpannableStringBuilder的使用;ClickableSpan失效;軟鍵盤擋住edi
阿新 • • 發佈:2019-01-02
效果概述:
- 模仿QQ聊天記錄
效果圖如下:
模擬器只有逍遙安卓了,實在不想重走genymotion的坑,但是逍遙沒法彈出軟鍵盤,就這麼看吧,可以下載原始碼在手機上執行,就可以看出來了。
遇到的問題(一)設定EditText焦點
我想實現點選進去EditText並不獲取焦點,而是手動點選的時候獲取到焦點,鍵盤彈出
這個實現倒不難,在EditText的父控制元件上加上這樣兩行程式碼即可
android:focusable="true"
android:focusableInTouchMode="true"
遇到的問題(二)EditText軟鍵盤和recyclerview的互動
我想實現(1)軟鍵盤彈出,recyclerview自動調整佈局,即將最後一條顯示於軟鍵盤之上
(2)軟鍵盤彈出的前提下,傳送訊息後,recyclerview再次調整佈局,將傳送的訊息顯示於軟鍵盤之上
這個問題折磨我好久,網上找出各種示例都不成功。
so,我把我的最後的解決辦法丟擲來,能不能解決你的問題那就看緣分啦
首先Manifests檔案中此activity加入如下程式碼;這是當彈出軟鍵盤的時候,自動調整佈局。網上有詳細解釋,我就不多說了。
<activity android:windowSoftInputMode="adjustResize|stateAlwaysHidden"
其次監聽軟鍵盤;當軟鍵盤彈出的時候,讓RecyclerView滑動到最後一個位置
layout = (RelativeLayout) findViewById(R.id.activity_main); ViewTreeObserver observer = layout.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override
ViewTreeObserver是主佈局獲取的佈局樹,通過佈局樹監聽整個螢幕高度的動態改變
最後當傳送訊息的時候,讓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上了。