2013-10-28 125 views
7

我試圖在顯示軟鍵盤時捕捉「後退」鍵事件。顯示軟鍵盤時的後退鍵的Android鍵事件?

我使用的SDK版本8,並能成功地捕捉到返回鍵事件僅當軟鍵盤如下隱藏:

@Override 
public void onBackPressed() { 
    // do something 
    super.onBackPressed(); 
} 

的問題是,該系統沒有要求,而軟鍵盤這種方法被顯示。我試圖登錄onKeyDown/Up()方法以及上面的方法來解決這種情況下發生的事情無濟於事。請看下圖:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    //DEBUGGING 
    Log.d(TAG + "KeyUP", String.valueOf(event)); 
} 

日誌返回音量和菜單鍵的預期,但在軟鍵盤和菜單隱藏在背面鍵只記錄。

有沒有可以解釋這種現象的「後退鍵」專家?

任何幫助,非常感謝。

回答

5

任何圍繞進一步挖掘本網站和Android API後,我發現,

KeyEvent.KEYCODE_BACK 

被輸入法連接和輸入法當前顯示(換句話說,軟鍵盤未被隱藏)的IME捕捉併吞噬。這意味着事件在系統調用Activity類的onKeyDown()或onKeyUp()方法之前被消耗。

要解決此問題,請創建IME小部件(TextView或其子類,如EditText)的子類並實現onKeyPreIme()

堆棧用戶i2097i發佈了一個很好的解決方案,在活動here中實施onKeyPreIme()。 如果您希望保留Android的默認行爲(即關閉鍵盤),請確保在onKeyPreIme()覆蓋中返回FALSE。

0

通常後退按鈕將隱藏鍵盤(nateve behaivor),所以它不是一個好主意,做與

+0

我同意你Joan,但在我的情況下,我只想隱藏一個EditText小部件(如果它是可見的)以及Android隱藏鍵盤的默認行爲。 – dan

5

這裏是捕獲回按鍵事件的方式: 1.程度EDITTEXT視圖覆蓋onKeyPreIme

package com.test.test; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.widget.EditText; 

/** 
* Created by sumit.saurabh on 11/10/16. 
*/ 
public class ChatEditText extends EditText 
{ 
    /* Must use this constructor in order for the layout files to instantiate the class properly */ 
    public ChatEditText(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
    } 

    private KeyImeChange keyImeChangeListener; 

    public void setKeyImeChangeListener(KeyImeChange listener) 
    { 
     keyImeChangeListener = listener; 
    } 

    public interface KeyImeChange 
    { 
     public void onKeyIme(int keyCode, KeyEvent event); 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) 
    { 
     if (keyImeChangeListener != null) 
     { 
      keyImeChangeListener.onKeyIme(keyCode, event); 
     } 
     return false; 
    } 
} 
  • ChatEditText在XML

    <com.test.test.ChatEditText 
         android:id = "@+id/messageEditText" 
         android:layout_width = "match_parent" 
         android:layout_height = "wrap_content" 
         android:layout_gravity = "bottom" 
         android:layout_marginLeft = "12dp" 
         android:layout_marginRight = "30dp" 
         android:background = "@null" 
         android:hint = "Type your message" 
         android:inputType = "textMultiLine" 
         android:singleLine = "false" 
         android:textColorHint = "#c4c0bd" 
         android:textSize = "18sp"/> 
    
  • 然後從如下任意位置附加聽衆:

    private ChatEditText messageEditText; 
    messageEditText = 
        (ChatEditText) findViewById(R.id.messageEditText); 
    
    messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){ 
        @Override 
        public void onKeyIme(int keyCode, KeyEvent event) 
        { 
         if (KeyEvent.KEYCODE_BACK == event.getKeyCode()) 
         { 
          // do something 
         } 
        }});