Android 另類方法監聽軟鍵盤的彈出收起事件


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() {
               
            }
        });

就可以做自己想做的事了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM