2161150_ja-JP

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2161150_ja-JP

2161150_ja-JP

複数のキーボードを無効にする方法

こんにちは、チームの皆さん
現在、LCDディスプレイ用にlvgl gui guider 1.9.1を使用して画面をビルディングしています。
画面の 1 つで、ユーザーに入力フィールドを提供する必要がある 12 個のテキストエリアを使用しています。そのため、複数のキーボードが使用されています。これらを無効にするにはどうすればよいでしょうか。すべてのテキストエリアに必要なのは 1 つのキーボードだけです。
基本的に、ユーザーは複数のフィールドにユーザー入力を行う必要があります。このために、私はテキストエリアを使用しており、キーボードのチェックマークをクリックすると、設定するためのコールバックがトリガーされます。これが私のユースCASEです。
早急に解決策を教えてください。

ありがとう、そしてよろしく。
サハナ

Re: how to disable multiples keyboards

こんにちは、

スクロール機能を使用するには、LVGL マニュアルを参照してください。

https://docs.lvgl.io/master/details/common-widget-features/scrolling.htm l

よろしくお願いします、
志明

Re: how to disable multiples keyboards

こんにちは。これについて何かありますか?
CANチームはより迅速な対応で私を支援してくれますか。
ありがとう、そしてよろしく。

サハナ

Re: how to disable multiples keyboards

こんにちは
解決策をありがとう
プロジェクトの作成中に、lvgl guider 1.9.1 を v9.2.1 を選択して使用しています。

参照がないというエラーが出ました

lv_keyboard_set_cursor_manage

入力フィールドのテキスト領域を作成するために、ご提案いただいたように独自のカスタム コードを試してみましたが、現時点ではテキスト領域とキーボードが重なっているのがわかります。
これをどう克服すればいいのでしょうか。基本的には、ページをスクロール可能にして、ユーザーがスクロールして他の入力チェック フィールドを見ることができるようにしたいと思っています。これで、キーボードの重なりの問題も解決されると思います。


スクリーンショットとコードを添付します
早急に解決策を教えてください

static lv_obj_t *kb;
lv_obj_t *ta_best_load_ratio_val_1;
lv_obj_t *ta_eco_cycle_period_val_1;
lv_obj_t *ta_eco_min_module_no_val_1;
lv_obj_t *ta_rect_save_stop_val_1;
lv_obj_t *ta_dry_time_val_1;
lv_obj_t *ta_best_load_ratio_val_2;
lv_obj_t *ta_eco_cycle_period_val_2;
lv_obj_t *ta_eco_min_module_no_val_2;
lv_obj_t *ta_dcdc_save_stop_val_2;
lv_obj_t *ta_dry_time_val_2;

LV_FONT_DECLARE(lv_font_NotoSans_Regular_18);

/* --- Callbacks --- */
static void ta_focus_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *ta = lv_event_get_target(e);
   

    if(code == LV_EVENT_CLICKED) {
        lv_keyboard_set_textarea(kb, ta);
        lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
         lv_obj_scroll_to_view(ta, LV_ANIM_ON);
    }
}

static void ta_done_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *ta = lv_event_get_target(e);

    if(code == LV_EVENT_READY) {
        const char *val = lv_textarea_get_text(ta);
        /* TODO: commit val to your app logic here */
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
        lv_keyboard_set_textarea(kb, NULL);
        printf("User entered: %s\n", val);
                fflush(stdout);
        lv_obj_scroll_to_y(lv_obj_get_parent(ta), 0, LV_ANIM_ON);
    } else if(code == LV_EVENT_CANCEL) {
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
        lv_keyboard_set_textarea(kb, NULL);
    }
}

static void kb_event_cb(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * kb = lv_event_get_target(e);
   
    if(code == LV_EVENT_READY) {
        lv_obj_t * ta = lv_keyboard_get_textarea(kb);
        if(ta) {
            const char * txt = lv_textarea_get_text(ta);
            printf("Committed value: %s\n", txt);
            fflush(stdout);
            // reset bg to default
            lv_obj_set_style_bg_color(ta, lv_color_hex(0xD8D8D8), 0);
            lv_obj_clear_state(ta, LV_STATE_FOCUSED);
            
        }
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
        lv_keyboard_set_textarea(kb, NULL);
    }
    else if(code == LV_EVENT_CANCEL) {
        lv_obj_t * ta = lv_keyboard_get_textarea(kb);
        if(ta) {
            // reset bg to default
            lv_obj_set_style_bg_color(ta, lv_color_hex(0xD8D8D8), 0);
        }
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
        lv_keyboard_set_textarea(kb, NULL);
    }
}


static void textarea_event_cb(lv_event_t * e)
{
    lv_obj_t * ta = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);

    if(code == LV_EVENT_CLICKED) {
        // User clicked / focused → mark editable
        lv_obj_set_style_bg_color(ta, lv_color_hex(ECO_LABEL_EDIT), 0);
    }
    else if(code == LV_EVENT_DEFOCUSED ) {
        // Lost focus (like clicking outside) → reset
        lv_obj_set_style_bg_color(ta, lv_color_hex(ECO_LABEL_DEFAULT), 0);
    }
}

static void keyboard_event_cb(lv_event_t * e)
{
    lv_obj_t * kb = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);

    if(code == LV_EVENT_READY) {   // Tick / OK button pressed
        lv_obj_t * ta = lv_keyboard_get_textarea(kb);
        if(ta) {
            const char * txt = lv_textarea_get_text(ta);

            // Simple validation: check if user entered something
            if(txt && strlen(txt) > 0) {
                printf("User entered: %s", txt);
                fflush(stdout);
            } else {
                printf("No input provided!");
                fflush(stdout);
            }

            // Reset to default once input is taken
            lv_obj_set_style_bg_color(ta, lv_color_hex(ECO_LABEL_DEFAULT), 0);
        }
    }
}



void screen_init(lv_obj_t *parent)
{
 
   lv_obj_set_scroll_dir(guider_ui.ECO_page, LV_DIR_VER);
   lv_obj_set_scrollbar_mode(guider_ui.ECO_page, LV_SCROLLBAR_MODE_ON);

    /* 1) Create one keyboard */
    kb = lv_keyboard_create(parent);
    lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
    lv_obj_set_size(kb, LV_PCT(100), LV_PCT(40));
    lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);

    // lv_obj_add_event_cb(kb, kb_event_cb, LV_EVENT_ALL, NULL);

    
    ta_best_load_ratio_val_1 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_best_load_ratio_val_1, 279, 132);   
    lv_obj_set_size(ta_best_load_ratio_val_1, 104, 30);  
    lv_obj_set_style_bg_color(ta_best_load_ratio_val_1, lv_color_hex(0xE8E8E8), 0);
    lv_obj_set_style_text_font(ta_best_load_ratio_val_1, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_best_load_ratio_val_1, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_best_load_ratio_val_1, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_best_load_ratio_val_1, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_best_load_ratio_val_1, LV_OBJ_FLAG_SCROLLABLE);

  
    ta_eco_cycle_period_val_1 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_eco_cycle_period_val_1, 279, 169); 
    lv_obj_set_size(ta_eco_cycle_period_val_1, 104, 30);   
    lv_obj_set_style_bg_color(ta_eco_cycle_period_val_1, lv_color_hex(0xD8D8D8), 0);
    lv_obj_set_style_text_font(ta_eco_cycle_period_val_1, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_eco_cycle_period_val_1, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_cycle_period_val_1, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_cycle_period_val_1, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_eco_cycle_period_val_1, LV_OBJ_FLAG_SCROLLABLE);

    ta_eco_min_module_no_val_1 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_eco_min_module_no_val_1, 693, 95); 
    lv_obj_set_size(ta_eco_min_module_no_val_1, 104, 30);   
    lv_obj_set_style_bg_color(ta_eco_min_module_no_val_1, lv_color_hex(0xD8D8D8), 0);
    lv_obj_set_style_text_font(ta_eco_min_module_no_val_1, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_eco_min_module_no_val_1, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_min_module_no_val_1, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_min_module_no_val_1, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_eco_min_module_no_val_1, LV_OBJ_FLAG_SCROLLABLE);

    ta_rect_save_stop_val_1 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_rect_save_stop_val_1, 693, 132); 
    lv_obj_set_size(ta_rect_save_stop_val_1, 104, 30);   
    lv_obj_set_style_bg_color(ta_rect_save_stop_val_1, lv_color_hex(0xE8E8E8), 0);
    lv_obj_set_style_text_font(ta_rect_save_stop_val_1, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_rect_save_stop_val_1, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_rect_save_stop_val_1, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_rect_save_stop_val_1, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_rect_save_stop_val_1, LV_OBJ_FLAG_SCROLLABLE);

    ta_dry_time_val_1 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_dry_time_val_1, 693, 169); 
    lv_obj_set_size(ta_dry_time_val_1, 104, 30);   
    lv_obj_set_style_bg_color(ta_dry_time_val_1, lv_color_hex(0xD8D8D8), 0);
    lv_obj_set_style_text_font(ta_dry_time_val_1, &lv_font_NotoSans_Regular_18, 0); 
    lv_obj_add_event_cb(ta_dry_time_val_1, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_dry_time_val_1, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_dry_time_val_1, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_dry_time_val_1, LV_OBJ_FLAG_SCROLLABLE);

    ta_best_load_ratio_val_2 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_best_load_ratio_val_2, 279, 280);   
    lv_obj_set_size(ta_best_load_ratio_val_2, 104, 30);  
    lv_obj_set_style_bg_color(ta_best_load_ratio_val_2, lv_color_hex(0xE8E8E8), 0);
    lv_obj_set_style_text_font(ta_best_load_ratio_val_2, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_best_load_ratio_val_2, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_best_load_ratio_val_2, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_best_load_ratio_val_2, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_best_load_ratio_val_2, LV_OBJ_FLAG_SCROLLABLE);

  
    ta_eco_cycle_period_val_2 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_eco_cycle_period_val_2, 279, 317); 
    lv_obj_set_size(ta_eco_cycle_period_val_2, 104, 30);   
    lv_obj_set_style_bg_color(ta_eco_cycle_period_val_2, lv_color_hex(0xD8D8D8), 0);
    lv_obj_set_style_text_font(ta_eco_cycle_period_val_2, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_eco_cycle_period_val_2, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_cycle_period_val_2, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_cycle_period_val_2, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_eco_cycle_period_val_2, LV_OBJ_FLAG_SCROLLABLE);

    ta_eco_min_module_no_val_2 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_eco_min_module_no_val_2, 693, 243); 
    lv_obj_set_size(ta_eco_min_module_no_val_2, 104, 30);   
    lv_obj_set_style_bg_color(ta_eco_min_module_no_val_2, lv_color_hex(0xD8D8D8), 0);
    lv_obj_set_style_text_font(ta_eco_min_module_no_val_2, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_eco_min_module_no_val_2, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_min_module_no_val_2, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_eco_min_module_no_val_2, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_eco_min_module_no_val_2, LV_OBJ_FLAG_SCROLLABLE);

    ta_dcdc_save_stop_val_2 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_dcdc_save_stop_val_2, 693, 280); 
    lv_obj_set_size(ta_dcdc_save_stop_val_2, 104, 30);   
    lv_obj_set_style_bg_color(ta_dcdc_save_stop_val_2, lv_color_hex(0xE8E8E8), 0);
    lv_obj_set_style_text_font(ta_dcdc_save_stop_val_2, &lv_font_NotoSans_Regular_18, 0);
    lv_obj_add_event_cb(ta_dcdc_save_stop_val_2, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_dcdc_save_stop_val_2, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_dcdc_save_stop_val_2, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_dcdc_save_stop_val_2, LV_OBJ_FLAG_SCROLLABLE);

    ta_dry_time_val_2 = lv_textarea_create(parent);
    lv_obj_set_pos(ta_dry_time_val_2, 693, 317); 
    lv_obj_set_size(ta_dry_time_val_2, 104, 30);   
    lv_obj_set_style_bg_color(ta_dry_time_val_2, lv_color_hex(0xD8D8D8), 0);
    lv_obj_set_style_text_font(ta_dry_time_val_2, &lv_font_NotoSans_Regular_18, 0); 
    lv_obj_add_event_cb(ta_dry_time_val_2, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_dry_time_val_2, ta_done_cb,  LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta_dry_time_val_2, textarea_event_cb, LV_EVENT_ALL, NULL);
    // lv_obj_clear_flag(ta_dry_time_val_2, LV_OBJ_FLAG_SCROLLABLE);

    
    // lv_obj_add_event_cb(kb, keyboard_event_cb, LV_EVENT_ALL, NULL);

}


/* Initialize custom UI */
void custom_init(lv_ui *ui)
{
    init_screen_timeout();
    screen_init(ui->ECO_page); 
}

Re: how to disable multiples keyboards

こんにちは、


  • 画面用に onelv_keyboard を作成し、デフォルトで非表示にして、すべてのテキスト領域で再利用します。
  • テキスト領域にフォーカス/クリックすると、lv_keyboard_set_textarea(kb, ta) が呼び出され、キーボードが表示されます。
  • ユーザーがキーボードの OK (✓) を押すと、LVGL は割り当てられたテキスト領域に LV_EVENT_READY を送信します。そのイベントを処理して値をコミットし、キーボードを非表示にします。
  • LVGL v8/v9では、独自のキーボードイベントハンドラを追加してもデフォルトのハンドラは削除されないため、コールバックを安全に追加できます。
#include "lvgl.h"

static lv_obj_t *kb;

static void ta_focus_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *ta = lv_event_get_target(e);

    if(code == LV_EVENT_FOCUSED || code == LV_EVENT_CLICKED) {
        lv_keyboard_set_textarea(kb, ta);
        lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
    }
}

static void ta_done_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *ta = lv_event_get_target(e);

    if(code == LV_EVENT_READY) {
        const char *val = lv_textarea_get_text(ta);
        /* your commit callback here with `val` */
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
        lv_keyboard_set_textarea(kb, NULL);
    } else if(code == LV_EVENT_CANCEL) {
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
        lv_keyboard_set_textarea(kb, NULL);
    }
}

void screen_init(lv_obj_t *parent)
{
    /* 1) Create one keyboard */
    kb = lv_keyboard_create(parent);
    lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
    lv_obj_set_size(kb, LV_PCT(100), LV_PCT(40));
    lv_keyboard_set_cursor_manage(kb, true);

    /* 2) Create multiple text areas (example: 2; repeat for all 12) */
    lv_obj_t *ta1 = lv_textarea_create(parent);
    lv_obj_set_width(ta1, 200);
    lv_obj_set_pos(ta1, 10, 10);
    lv_obj_add_event_cb(ta1, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta1, ta_done_cb,  LV_EVENT_ALL, NULL);

    lv_obj_t *ta2 = lv_textarea_create(parent);
    lv_obj_set_width(ta2, 200);
    lv_obj_set_pos(ta2, 10, 60);
    lv_obj_add_event_cb(ta2, ta_focus_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(ta2, ta_done_cb,  LV_EVENT_ALL, NULL);

    /* ...repeat for ta3..ta12... */



よろしくお願いします、
志明

标记 (1)
无评分
版本历史
最后更新:
‎11-20-2025 01:57 PM
更新人: