2011-02-07 142 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作为第一次在以前的答案建议。