HarmonyOS 鸿蒙Next 回车切换到下一个TextField

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 回车切换到下一个TextField
回车切换到下一个输入框.

三个核心方法:

setUserNextFocus(int side, int id); // 设置下一个要切换的光标位置
findRequestNextFocus(int side); // 切换到下一个要切换光标位置

Component.KeyEventListener; // 监听键盘输入

这里的setUserNextFocus的第一个参数,有很多:

此处用FOCUS_NEXT实现.

直接上代码.

public class MainAbilitySlice extends AbilitySlice implements Component.KeyEventListener {
    private static final HiLogLabel LABEL = new HiLogLabel(HiLog.INFO, 0x000110, "KeyEventListener");

    // 输入框
    private TextField storeKey;
    private TextField storeValue;
    private TextField getDataKey;
    private TextField removeDataKey;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        initButton();
    }

    private void initButton() {
        storeKey = (TextField) findComponentById(ResourceTable.Id_store_data_key);
        storeValue = (TextField) findComponentById(ResourceTable.Id_store_data_value);
        getDataKey = (TextField) findComponentById(ResourceTable.Id_get_data_key);
        removeDataKey = (TextField) findComponentById(ResourceTable.Id_remove_data_key);

        storeKey.setUserNextFocus(Component.FOCUS_NEXT, ResourceTable.Id_store_data_value);
        storeValue.setUserNextFocus(Component.FOCUS_NEXT, ResourceTable.Id_get_data_key);
        getDataKey.setUserNextFocus(Component.FOCUS_NEXT, ResourceTable.Id_remove_data_key);

        storeKey.setKeyEventListener(this::onKeyEvent);
        storeValue.setKeyEventListener(this::onKeyEvent);
        getDataKey.setKeyEventListener(this::onKeyEvent);
    }

    @Override
    public boolean onKeyEvent(Component component, KeyEvent keyEvent) {
        HiLog.info(LABEL, "按键事件触发");
        if (checkFocus(keyEvent, storeKey)) {
            return true;
        } else if (checkFocus(keyEvent, storeValue)) {
            return true;
        } else if (checkFocus(keyEvent, getDataKey)) {
            return true;
        }
        return false;
    }

    private boolean checkFocus(KeyEvent keyEvent, TextField textField) {
        if (textField.hasFocus()) {
            // 如果不增加该判断则会触发两次
            if (keyEvent.isKeyDown()) {
                if (keyEvent.getKeyCode() == keyEvent.KEY_ENTER) {
                    textField.findRequestNextFocus(Component.FOCUS_NEXT);
                }
                return true;
            }
        }
        return false;
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">
    <TextField
        ohos:id="$+id:store_data_key"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:basement="#9e9e9e"
        ohos:focus_border_width="1px"
        ohos:hint="key"
        ohos:text_size="50"
        ohos:padding="50"/>
    <TextField
        ohos:id="$+id:store_data_value"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:basement="#9e9e9e"
        ohos:focus_border_width="1px"
        ohos:hint="value"
        ohos:text_size="50"
        ohos:padding="50"/>
    <TextField
        ohos:id="$+id:get_data_key"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:basement="#9e9e9e"
        ohos:focus_border_width="1px"
        ohos:hint="key2"
        ohos:text_size="50"
        ohos:padding="50"/>
    <TextField
        ohos:id="$+id:remove_data_key"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:basement="#9e9e9e"
        ohos:focus_border_width="1px"
        ohos:hint="key3"
        ohos:text_size="50"
        ohos:padding="50"/>
</DirectionalLayout>

更多关于HarmonyOS 鸿蒙Next 回车切换到下一个TextField的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 回车切换到下一个TextField的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,若要实现用户在界面上通过回车键(Enter键)切换到下一个TextField组件的功能,这通常涉及到对键盘事件的处理和焦点管理。以下是一个简要的实现思路:

  1. 监听键盘事件:为每个TextField组件设置键盘事件监听器,检测回车键的按下事件。

  2. 管理焦点:在检测到回车键事件后,通过编程方式将焦点从当前TextField转移到下一个TextField。HarmonyOS提供了API来请求和转移焦点,如requestFocus()方法。

  3. 顺序控制:确保所有TextField组件按照期望的顺序排列,并在代码中正确引用它们,以便在回车键事件发生时按顺序转移焦点。

  4. UI布局:确保UI布局合理,避免由于布局问题导致的焦点转移异常。

示例代码片段(伪代码,具体实现需根据HarmonyOS SDK文档调整):

// 假设有两个TextField组件textField1和textField2
textField1.setOnKeyListener(new OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
            textField2.requestFocus();
            return true; // 消费事件,防止默认行为
        }
        return false;
    }
});

注意:上述代码仅为概念性示例,实际开发中需使用HarmonyOS提供的相应API和组件。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部