back鍵隱藏軟件按盤 同時隱藏View 攔截view的ontouch事件


如圖所示,在點擊back鍵時同時隱藏上面包含EditText控件的View,這個問題糾結了我很久,後來在度娘裏頭找到了解決方法:

第一種解決辦法:

1、創建EventLinearLayout 繼承 LinearLayout 

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.LinearLayout;

import static com.cmcc.migutvtwo.util.LogUtils.LOGE;

/**
 * Created by on 2016/1/24.
 */
public class EventLinearLayout extends LinearLayout {


    /** 初始化狀態 **/
    public static final byte KEYBOARD_STATE_INIT = -1;
    /** 隱藏狀態 **/
    public static final byte KEYBOARD_STATE_HIDE = -2;
    /** 打開狀態 **/
    public static final byte KEYBOARD_STATE_SHOW = -3;
    private boolean isInit;// 是否爲初始化狀態
    private int viewHeight;// 佈局高度
    private boolean hasKeybord;// 標識是否打開了軟鍵盤
    private OnKeyboardsChangeListener keyboarddsChangeListener;// 鍵盤狀態監聽

    public EventLinearLayout(Context context) {
        super(context);
    }

    public EventLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EventLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (!isInit) {
            isInit = true;
            viewHeight = b;
        } else {
            viewHeight = viewHeight < b ? b : viewHeight;
        }
        if (isInit && viewHeight > b) {
            hasKeybord = true;
            keyboardSateChange(KEYBOARD_STATE_SHOW);
            this.setVisibility(VISIBLE);
            LOGE("彈幕 ==  顯示軟鍵盤");
        }
        if (isInit && hasKeybord && viewHeight == b) {
            hasKeybord = false;
            keyboardSateChange(KEYBOARD_STATE_HIDE);
            LOGE("彈幕 ==  隱藏軟鍵盤");
            this.setVisibility(GONE);
         }
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        this.setVisibility(GONE);
        LOGE("彈幕 ==  隱藏  ");
        hasKeybord = false;
        return super.dispatchKeyEventPreIme(event);
    }

    /**
          * 切換軟鍵盤狀態
          *
          * @param state
          *            // 狀態
          */
    public void keyboardSateChange(int state) {
        if (keyboarddsChangeListener != null) {
            keyboarddsChangeListener.onKeyBoardStateChange(state);
        }
    }

    /**
          * 軟鍵盤狀態切換監聽
          *
          * @author zihao
          *
          */
    public interface OnKeyboardsChangeListener {
        public void onKeyBoardStateChange(int state);
    }

    public boolean isHasKeybord() {
        return hasKeybord;
    }

    public void setHasKeybord(boolean hasKeybord) {
        this.hasKeybord = hasKeybord;
    }
}

2、創建佈局文件
<?xml version="1.0" encoding="utf-8"?>
<com.cmcc.migutvtwo.ui.widget.EventLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/comment_edit_panel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

</com.cmcc.migutvtwo.ui.widget.EventLinearLayout>
在其他程序中隱藏軟鍵盤的同時也要設置 EventLinearLayout 中的 軟鍵盤變量爲隱藏軟鍵盤:
((EventLinearLayout)danmakuInputview).setHasKeybord(false);


第二種解決辦法:
給播放器添加OnTouchListener事件,點擊軟鍵盤跟包含EditText控件的View之間的中間部位,軟鍵盤跟view同時消失,問題是在點擊view上面空餘部分時,軟鍵盤跟view也會同時消失,所以要避免這個問題,採用下面的方法處理,攔截view層的onTouch事件:

danmakuInputview.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    return true;
  }
});


軟鍵盤的監聽:
使用OnKeyListener的方法來監聽軟鍵盤按鍵
  1. private OnKeyListener onKeyListener = new OnKeyListener() {  
  2.           
  3.         @Override  
  4.         public boolean onKey(View v, int keyCode, KeyEvent event) {  
  5.             if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN){  
  6.                 /*隱藏軟鍵盤*/  
  7.                 InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
  8.                 if(inputMethodManager.isActive()){  
  9.                     inputMethodManager.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);  
  10.                 }                    
  11.                 return true;  
  12.             }  
  13.             return false;  
  14.         }  
  15.     };  
  1. edittext.setOnKeyListener(onKeyListener);  
幫助程序員更精確的判斷右下角按鍵情況,以便應對更加複雜的情況。它可以幫助程序員依據當前郵件下爲“GO”,“done”,“search”鍵的情況下做出更細分的操作:
  1. edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {  
  2.               
  3.             @Override  
  4.             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {  
  5.                 /*判斷是否是“GO”鍵*/  
  6.                 if(actionId == EditorInfo.IME_ACTION_GO){  
  7.                     /*隱藏軟鍵盤*/  
  8.                     InputMethodManager imm = (InputMethodManager) v  
  9.                             .getContext().getSystemService(  
  10.                                     Context.INPUT_METHOD_SERVICE);  
  11.                     if (imm.isActive()) {  
  12.                         imm.hideSoftInputFromWindow(  
  13.                                 v.getApplicationWindowToken(), 0);  
  14.                     }  
  15.                       
  16.                     return true;  
  17.                 }  
  18.                 return false;  
  19.             }  
  20.         });  
EditText控件的imeOptions屬性設置成不同的值(此時Enter鍵可以顯示不同的文字和圖案):
  1. <EditText  
  2.         android:id="@+id/edittext"  
  3.         android:layout_width="match_parent"  
  4.         android:layout_height="wrap_content"  
  5.         android:singleLine="true"  
  6.         android:imeOptions="actionSearch"/>  
actionNone : 回車鍵,按下後光標到下一行 actionGo : Go, actionSearch : 放大鏡 actionSend : Send actionNext : Next actionDone : Done,確定/完成,隱藏軟鍵盤,即使不是最後一個文本輸入框

發佈了15 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章