11. 自定义键盘动作

11.1 问题

要自定义软键盘上Enter键的外观,或者改变用户按这个键所触发的动作,或者两者都要实现。

11.2 解决方案

(API Level 3)
自定义键盘输入数据小部件的输入方法(Input Method,IME)选项。

11.3 实现机制

1. 自定义Enter键

软键盘出现在屏幕上时,Enter键上的文字通常显示的是根据当前聚焦的控件在视图中的顺序所执行的动作。在没有特别指定时。如果视图中还有其他可聚焦的控件,这个按键会显示next动作;如果当前聚焦的对象已经是最后一个可聚焦对象,则会显示done动作。对于多行字段,该动作为换行。对于每个输入视图,通过视图的XML文件中的android:imeOptions可以自定义这个值。可用于自定义Enter键的值如下所示:

  • actionUnspecified :默认值,根据设备的情况显示动作。
    动作事件是IME_NULL。
  • actionGo : 在Enter键上显示Go。
    动作事件是IME_ACTION_GO。
  • ActionSearch :在Enter键上显示搜索图标。
    动作事件是IME_ACTION_SEARCH。
  • actionSend : 在Enter键上显示Send。
    动作事件是IME_ACTION_SEND。
  • actionNext : 在Enter键上显示Next。
    动作事件是IME_ACTION_NEXT。
  • actionDone :在Enter键上显示Done。
    动作事件是IME_ACTION_DONE。
    下面看一个有两个可编辑文本框的布局,如以下代码清单所示。第一个文本框在Enter键上显示搜索放大镜图标,第二个则显示Go。
    res/layout/main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <EditText
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:imeOptions="actionSearch"/>
  <EditText
    android:id="@+id/text2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:imeOptions="actionGo"/>
</LinearLayout>

最终显示的键盘可能会因为生产商自定义的用户界面工具包而有些许差异,Google原生用户界面的效果如图所示。
Enter键上的自定义输入选项(第一行)
Enter键上的自定义输入选项(第二行)

注意:
自定义编辑器选项只会影响软键盘输入。改变这些选项的值不会影响到用户在物理键盘上按Enter键时触发的事件。

2. 自定义动作

与自定义Enter键上显示的文字一样重要的是自定义用户按下此按键时所触发的动作。重载动作的默认行为只需要给相应的视图加上TextView.OnEditorActionListener。下面继续修改上面的布局示例,这次给两个视图都加上一个自定义的动作(参见以下代码)。

实现了自定义按键动作的Activity

public class MyActivity extends Activity implements TextView.OnEditorActionListener{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //给视图添加监听器
        EditText text1 = (EditText)findViewById(R.id.text1);
        text1.setOnEditorActionListener(this);
        EditText text2 = (EditText)findViewById(R.id.text2);
        text2.setOnEditorActionListener(this);
    }

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == IME_ACTION_SEARCH){
            //处理搜索按键单击
            return true;
        }
        if (actionId == IME_ACTION_GO){
            //处理Go按键单击
            return true;
        }
        return false;
    }
}

onEditorAction()返回的布尔值会告诉系统应用是否处理了这个事件,或者是否应该将其传递给下一个可能的响应者(如果有的话)。所以在实现该方法时一定要返回true,这样系统就不会再对其他实现进行处理。当然,如果没有处理这个事件,就可以返回false,这样系统的其他部分就能对其进行处理。

注意:
如果应用程序自定义为某个键盘返回的actionId值,则要注意只会在软键盘IME上进行这种自定义。如果设备附带物理键盘,Enter键就会始终返回值为0的actionId或IME_NULL。

猜你喜欢

转载自blog.csdn.net/qq_41121204/article/details/83021458