最近做一個(gè)類似微信朋友圈的功能箱熬,發(fā)現(xiàn)這個(gè)要做精細(xì)了类垦,還是挺麻煩的,以評(píng)論為例城须。細(xì)細(xì)體驗(yàn)蚤认,它有如下特性:
- 點(diǎn)擊評(píng)論的時(shí)候,才顯示評(píng)論輸入框糕伐。
- 輸入框顯示的位置緊緊靠在待評(píng)論消息的底部砰琢。
- 滑動(dòng)其它地方,輸入法和評(píng)論輸入框自動(dòng)隱藏良瞧。
- 點(diǎn)擊back物理鍵陪汽,輸入法和評(píng)論輸入框自動(dòng)隱藏。
其中1和3比較簡(jiǎn)單褥蚯。邏輯如下:
- 問題1. 點(diǎn)擊評(píng)論的時(shí)候掩缓,才顯示評(píng)論輸入框。
實(shí)現(xiàn)思想:評(píng)論輸入框的默認(rèn)狀態(tài)為隱藏遵岩,點(diǎn)擊評(píng)論按鈕或者其它評(píng)論時(shí)你辣,更改狀態(tài)為顯示巡通,同時(shí)觸發(fā)輸入法彈出的操作
public static void showSoftInput(Context context, View view){
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
//imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
}
- 問題2. 滑動(dòng)其它地方,輸入法和評(píng)論輸入框自動(dòng)隱藏舍哄。
實(shí)現(xiàn)思想:給ListView一個(gè)Touch監(jiān)聽宴凉,出現(xiàn)滑動(dòng)就隱藏評(píng)論輸入框和輸入法。
listView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
CommonUtils.hideSoftInput(context, mEditText);
mEditTextBody.setVisibility(View.GONE);
return false;
}
}
剩下兩個(gè)問題是難點(diǎn)表悬。
難點(diǎn)1:輸入框顯示的位置緊緊靠在待評(píng)論消息的底部弥锄。
初步想了三種方案:
- 每個(gè)item后面帶一個(gè)評(píng)論輸入框
- 評(píng)論輸入框采用PopupWindow的形式實(shí)現(xiàn),直接在待評(píng)論消息的底部彈出蟆沫。
- 所有item共用一個(gè)評(píng)論輸入框籽暇,該框放置在ListView父容器的底部
一一實(shí)踐后,發(fā)現(xiàn):
-
每個(gè)item后面帶一個(gè)評(píng)論輸入框
是行不通的饭庞,因?yàn)檩斎敕]有辦法自動(dòng)彈出來戒悠,而點(diǎn)擊輸入框時(shí),極容易觸發(fā)Touch事件舟山,導(dǎo)致輸入框和發(fā)送按鈕被隱藏 -
評(píng)論輸入框采用PopupWindow的形式實(shí)現(xiàn)绸狐,直接在待評(píng)論消息的底部彈出。
也不行累盗,因?yàn)镻opupWindow內(nèi)部輸入法選中時(shí)寒矿,無法滑動(dòng)下面的ListView,所以若债,被評(píng)論的消息很容易被遮擋住符相。這一塊相關(guān)的代碼可以參考這篇文章——popupwindow中EditText獲取焦點(diǎn)后自動(dòng)彈出軟鍵盤 -
所有item共用一個(gè)評(píng)論輸入框,該框放置在ListView父容器的底部
可行蠢琳,做出來的效果和微信類似啊终。
核心邏輯和相關(guān)代碼如下:
- 計(jì)算 彈出鍵盤后評(píng)論輸入框距離頂部的距離y1 和 所評(píng)論item底部距離頂部的距離y2,讓ListView從y2滑動(dòng)到y(tǒng)1
//注意挪凑,由于彈出輸入法需要一定的時(shí)間孕索,所以該方法要延遲500ms計(jì)算逛艰,500ms為經(jīng)驗(yàn)值躏碳,僅供參考。
mEditTextBody.postDelayed(new Runnable() {
@Override
public void run() {
//16/5/31 計(jì)算移動(dòng)距離
int[] position1 = new int[2];
itemBottomView.getLocationOnScreen(position);
Log.d(TAG, "srcViewRect.x = " + position1[0]);
Log.d(TAG, "srcViewRect.y = " + position1[1]);
int[] position2 = new int[2];
mEditTextBody.getLocationOnScreen(position2);
Log.d(TAG, "mEditTextBody.x = " + position2[0]);
Log.d(TAG, "mEditTextBody.y = " + position2[1]);
mListView.scrollBy(0, position1[1] - position2[1]);
}
}, 500);
難點(diǎn)2:點(diǎn)擊back物理鍵散怖,輸入法和評(píng)論輸入框自動(dòng)隱藏菇绵。
目前沒有找到解決方案,onBackPressed監(jiān)聽不到被輸入法消耗的back鍵镇眷。
擴(kuò)展閱讀
在搜索相關(guān)問題是咬最,找到一個(gè)知乎問題微信表情選擇框的高度是如何做到在任何手機(jī)上適配輸入法框高度的?欠动,然后知道微信開發(fā)人員開源一個(gè)庫(kù)用來計(jì)算輸入法的高度永乌,對(duì)這個(gè)問題沒有太大作用惑申,但對(duì)做輸入法和表情之間的切換比較有參考價(jià)值,感興趣的朋友可以看看翅雏,這個(gè)庫(kù)是JKeyboardPanelSwitch圈驼。
Panda
2016-06-01