こんにちは、チームの皆さん
現在、LCDディスプレイ用にlvgl gui guider 1.9.1を使用して画面をビルディングしています。
画面の 1 つで、ユーザーに入力フィールドを提供する必要がある 12 個のテキストエリアを使用しています。そのため、複数のキーボードが使用されています。これらを無効にするにはどうすればよいでしょうか。すべてのテキストエリアに必要なのは 1 つのキーボードだけです。
基本的に、ユーザーは複数のフィールドにユーザー入力を行う必要があります。このために、私はテキストエリアを使用しており、キーボードのチェックマークをクリックすると、設定するためのコールバックがトリガーされます。これが私のユースCASEです。
早急に解決策を教えてください。
ありがとう、そしてよろしく。
サハナ
こんにちは、
スクロール機能を使用するには、LVGL マニュアルを参照してください。
https://docs.lvgl.io/master/details/common-widget-features/scrolling.htm l
よろしくお願いします、
志明
こんにちは。これについて何かありますか?
CANチームはより迅速な対応で私を支援してくれますか。
ありがとう、そしてよろしく。
サハナ
こんにちは
解決策をありがとう
プロジェクトの作成中に、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);
}こんにちは、
#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... */
よろしくお願いします、
志明