2011-02-07 78 views
13

我有一個活動,在那裏我想要打開軟件鍵盤。鍵盤打開後如何在BACK按下後關閉活動?現在我必須單擊BACK兩次,先關閉鍵盤然後完成活動。如何在BACK按下後用軟件鍵盤關閉活動?

+0

好questin我也對你的答案感興趣..... upvoted和加星..... – 2011-02-08 07:49:53

+0

這看起來像這個問題的重複:[http://stackoverflow.com/questions/3940127/intercept-從軟鍵盤返回按鈕](http://stackoverflow.com/questions/3940127/intercept-back-button-from-soft-keyboard) – 2011-02-08 00:27:29

回答

0

您可以使用以下

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) 
    { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
      finish(); 
      return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 
+0

不幸的是,這是行不通的。當鍵盤打開時,不會調用onKeyUp()。 – fhucho 2011-02-07 13:15:03

0
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
      finish(); 
      return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

但告訴ü有一件事你必須把另一精力用於檢測鍵盤是開放的,除可以用於決定是否使用標誌返回或完成活動

3

使用onKeyPreIme(int keyCode,KeyEvent event)方法和檢查KeyEvent.K EYCODE_BACK事件。這是非常簡單的,沒有做任何奇特的編碼。

0

設置爲EditText上一個OnEditorActionListener爲您提供軟鍵盤像下面的活動,

 editText.setOnEditorActionListener(new OnEditorActionListener() { 

     public boolean onEditorAction(TextView v, int actionId, 
       KeyEvent event) { 
      if (event != null 
        && (event.getKeyCode() == KeyEvent.KEYCODE_BACK)) { 
       finish(); 
      } 
      return false; 
     } 
    }); 
6

如前所述,onKeyPreIme可以用來捕捉返回按鈕,但是這需要重寫在文本視圖上,而不是在活動中。

下面是一個完整的解決方案:

首先,從EditText上派生新類,覆蓋onKeyPreIme並調用回調接口:

// EditTextWithBackButton class 
public class EditTextWithBackButton extends EditText 
{ 
    public interface IOnBackButtonListener 
    { 
     boolean OnEditTextBackButton(); 
    } 

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

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

    public void setOnBackButtonListener(IOnBackButtonListener l) 
    { 
     _listener = l; 
    } 

    IOnBackButtonListener _listener; 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) 
    { 
     if (event.getAction()==KeyEvent.ACTION_UP && keyCode==KeyEvent.KEYCODE_BACK) 
     { 
      if (_listener!=null && _listener.OnEditTextBackButton()) 
       return false; 
     } 
     return super.onKeyPreIme(keyCode, event); //To change body of overridden methods use File | Settings | File Templates. 
    } 
} 

下一步,更新您的佈局:

<com.yournamespace.whatever.EditTextWithBackButton 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/textField" 
     /> 

接下來,在setContentView之後,在OnCreate中更新您的活動:

((EditTextWithBackButton) findViewById(R.id.textField)).setOnBackButtonListener(new EditTextWithBackButton.IOnBackButtonListener() 
{ 
    @Override 
    public boolean OnEditTextBackButton() 
    { 
     finish(); 
     return true; 
    } 
}); 
1

我不相信你會需要監聽器,setOnBackButtonListener,因爲它已被首次建議。

我得到它的工作使用的getContext():

public class EditedText extends EditText { 

    @Override 
    public boolean onKeyPreIme (int keyCode, KeyEvent event){ 

     if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ 

      Activity activity = (Activity) getContext(); 

      activity.finish(); 

      return true; 
     } 
     return super.onKeyPreIme(keyCode, event); 
    } 
} 

注意,因爲該事件是「處理」,我返回true,而不是false作爲第一次在以前的答案建議。

相關問題