2012-01-14 68 views
10

我在tab控制器內部有一些意圖,對於其中的一個我有一個編輯文本,我需要確定它何時具有焦點以及何時失去焦點。 我已經映射了大部分事件,如焦點偵聽器,OnEditorActionListener等,現在我唯一的問題仍然是,當我有焦點軟鍵盤出現,我想要關閉它:1)完成按鈕,而不是通過手機上的後退按鈕(禁用後退按鈕以在鍵盤可見時關閉鍵盤) 2)在鍵盤可見時檢測後退按鈕事件,以便我可以將焦點傳遞給其他控件。在Android鍵盤上檢測返回事件

我嘗試了多種方式,但沒有成功,像onBackPressed,onConfigurationChanged(在清單中添加hiddenKeyboard),key_down對活動等,但沒有成功。

有沒有人成功了?實際上,我希望當鍵盤可見時,按下手機,我的編輯文本失去焦點(otherControl.requestFocus - >這是一個相對佈局)。

+0

告訴我你嘗試過什麼到目前爲止 – confucius 2012-01-14 09:44:21

+0

1.這個 txtSearchBar .setOnEditorActionListener(new EditText.OnEditorActionListener() \t {\t \t public boolean onEditorAction(T extView V,INT actionId,KeyEvent的事件) \t { \t如果(event.getKeyCode()== KEYCODE_BACK) \t { \t \t layoutFocus.requestFocus(); \t \t \t \t} \t return false; \t} \t}); 2.方法2 onBackPressed,layoutFocus.requestFocus(); 3。添加hiddenKeyboard清單中的這項活動,並把 \t @覆蓋 \t公共無效onConfigurationChanged(配置NEWCONFIG) – Catalin 2012-01-14 09:49:54

+0

,因爲我不能回答我的問題,如果我有100個多點的聲譽:) – Catalin 2012-01-14 09:54:31

回答

2

這裏是

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
     if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) 
    { //do you back event work here 
      }  
    return super.dispatchKeyEvent(event); 
} 
+2

感謝您的代碼,但它是不是很遺憾工作:(用你的方法時,軟鍵盤已經隱藏了返回鍵只被困(我按完成按鈕後),然後它超出了計劃。當鍵盤顯示和我按回,它執行的鍵盤隱藏,但通過這種方法不走。我在Android 2.2和2.3的測試是 – Catalin 2012-01-14 18:57:40

+0

因爲當u按下背部和鍵盤了,只有鍵盤活動聽的是和它回到過去,你可以聽回來的事件當且僅當用戶按下回你的活動,在這種情況下,鍵盤活動聽這回事件.. – AAnkit 2012-01-15 07:19:14

+0

任何方式跟蹤從鍵盤活動的回來嗎?或者任何方法來禁用後退按鈕的工作,而鍵盤是嗎?喜歡的東西繼承編輯文本和改變一些事情?這可能嗎? – Catalin 2012-01-15 10:42:09

9

老話題,但這裏是預期的答案

@Override 
public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { 
     Toast.makeText(getContext(), "BACK", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 
    return super.onKeyPreIme(keyCode, event); 
} 

你應該把這個在覆蓋的EditText一類(級MyEditText擴展的EditText ...)

3

以下是捕獲後退按鍵事件的方法: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; 
    } 
} 

2.在XML ChatEditText

<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"/> 

3.然後從任何地方像這樣附加一個監聽器:

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