http://www.cnblogs.com/csonezp/p/5065624.html
最近做的項目碰到個問題,a界面是fragment+recyclerview,b界面帶個edittext,並且會自動獲得焦點彈出軟鍵盤。由a界面進入b界面,再結束b界面返回a界面,就會在a界面上留下一片和軟鍵盤大小相同的灰色區域,具體原因搞了很久也不清楚。但是問題總是要解決的,我在a的fragment上折騰了半天,始終沒什么用。然后就想着在b界面折騰折騰,關閉activity的時候先收起挼鍵盤,軟鍵盤收起完畢再finish。
InputMethodManager中並沒有軟鍵盤收起的監聽事件,上網查也沒查到。既然找不到特定的監聽事件,那就要從其他方面入手了。想到軟鍵盤彈出的時候窗口的size會改變,正好b的邏輯不設計窗口size的改變,於是就重寫b最底層的layout的onsizechange事件,用窗口size來代替軟鍵盤的彈出/收起事件。
首先定義個listener:
/** * Created by csonezp on 15-12-21. */ public interface InputWindowListener { void show(); void hidden(); }
這個監聽器是用來通知activity的。
b界面的最底層布局是RelativeLayout,於是我們就要重寫一個RelativeLayout:
/** * Created by csonezp on 15-12-21. * 用onsizechange來模擬實現監聽軟鍵盤的彈出收起事件 */ public class IMMListenerRelativeLayout extends RelativeLayout { private InputWindowListener listener; public IMMListenerRelativeLayout(Context context) { super(context); } public IMMListenerRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public IMMListenerRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (oldh > h) { L.d("input window show"); listener.show(); } else{ L.d("input window hidden"); listener.hidden(); } } public void setListener(InputWindowListener listener) { this.listener = listener; } }
名字不要吐槽了,隨便起的。
重點看onSizeChanged方法,如果是軟鍵盤由收起變成彈出,那oldh就是全屏高度,h就是全屏高度減去軟鍵盤的高度;如果軟鍵盤由彈出變成收起,則h為全屏高度,oldh反之。
由此我們就可以判斷出軟鍵盤的狀態了。
在activity的布局里,將原來的RelativeLayout換成自定義的布局,然后
mainlayout.setListener(new InputWindowListener() { @Override public void show() { } @Override public void hidden() { } });
就可以做自己想做的事了