为EditText实现自定义Numpad

时间:2012-01-17 13:24:18

标签: java android

我有一个带有小键盘(键0-9,确定和删除)的应用程序,它总是在屏幕上可见。

当用户将焦点设置在具有数字输入法的EditText上时,按下小键盘上的键应该应用于焦点EditText

我目前的方法是使用数字输入法在每个OnFocusChanged上设置一个EditText侦听器,然后记住焦点控件:

 EditText txt1 = (EditText) findViewById(R.id.editText1);
        txt1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
          public void onFocusChange(View v, boolean hasFocus) {
              if(hasFocus)
                  focused = (EditText)v; // focused is a member of the Activity class
          }});

然后,当按下小键盘键时,该键将应用于focused控件。

对我而言,这似乎有点复杂,是否有一种更简单的方法可以使用数字输入法自动工作(没有焦点更改侦听器)所有EditText小部件?

其次,是否有办法仅使用数字输入禁用那些EditText小部件的软键盘?

1 个答案:

答案 0 :(得分:1)

我认为您可以将onKeyDown()用于EditText(我们称之为numberBox)。

逻辑是:

假设您在集合中拥有所有数字按钮:

private ImageButton []digitButtons = new ImageButton[10]; 

为每个按钮设置onClickListeners:

private void setClickListenersForDigitButtons() {

    for(int i=0; i < digitButtons.length; i++) {

        int resId = getResources().getIdentifier(getPackageName()+":id/btn_digit_"+i, null, null);

        digitButtons[i] = (ImageButton)findViewById(resId);

        final int keyCode = KeyEvent.KEYCODE_0 + i;

        digitButtons[i].setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                keyPressed(keyCode);
            }
        });
    }

}

在keyPressed方法中:

private void keyPressed(int keyCode) {

    KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
    numberBox.onKeyDown(keyCode, event);
}