Нет события OnKeyDown для клавиши возврата на Delphi Android 10.3.3 - PullRequest
0 голосов
/ 22 января 2020

Я нахожусь в процессе обновления с Delphi 10.2.3 до 10.3.3. Мои приложения android теперь не генерируют событие OnKeyDown с виртуальной клавиатуры для клавиши Return. Я подтвердил это, используя очень простой c недавно созданный проект, так что это никак не связано с преобразованием из 10.2.3.

Будут признательны за любые идеи.

QA на embarcadero вернулись со следующим ответом:

"Согласно этой документации - Обрабатывать действия клавиатуры или это - KeyEvent :

При обработке событий клавиатуры с помощью класса KeyEvent и связанных с ним API следует ожидать, что такие события клавиатуры происходят только с аппаратной клавиатуры. Вы никогда не должны полагаться на получение ключа события для любой клавиши мягкого метода ввода (экранная клавиатура).

Я думаю, что использование методов, которые запускаются при изменении текста, является достаточным обходным решением этой проблемы ...

Я думаю, что этот Stackoverflow вопрос и этот Blogpost могут быть полезны. "

Предлагаемое решение включает добавление TextListener в JFMXTextEditorProxy, и этот последний интерфейс исчез из delphi 10,3. В настоящее время я пытаюсь реализовать что-то эквивалентное в 10.3, но буду признателен за любые рекомендации. Кстати, у других будут разные цели, но, с моей стороны, я хочу видеть только ключ возврата.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Обновление: изначально предполагалось, что это ошибка. QA at embarcadero, однако, придерживаются мнения, что это не так, и не следует полагаться на виртуальную клавиатуру для запуска событий клавиатуры. Но они не предлагают других жизнеспособных альтернатив. Сообщение в блоге, которое они цитировали, не подходит для 10.3, и кажется, что оно никогда не увидит ключ возврата.

Я наткнулся на обходной путь, который, кажется, работает, хотя он также может быть подвержен будущему изменяется.

Если изменить значение ReturnKeyType объекта Tedit на любое из значений Go, Поиск или Отправить , событие onkeydown будет стрелять по ключу возврата. Другой альтернативой может быть использование события OnChange. Это не срабатывает для клавиши возврата, когда для параметра Tedit также задано значение по умолчанию ReturnKeyType, но если для него установлено любое из вышеуказанных значений (плюс также Next), оно будет срабатывать. ReturnKeyType доступен во время разработки, а также может быть изменен в коде, например:

  edit1.ReturnKeyType := TReturnKeyType.Go;

И если действительно отчаянно, я заметил, что событие OnChange сработает, если содержимое редактирования действительно изменилось и один использует Android кнопку «назад» для закрытия виртуальной клавиатуры.

0 голосов
/ 12 февраля 2020

Для решения различных вопросов, которые возникли в этом обсуждении:

  1. RSP-27496 был вновь открыт
  2. Вы можете решить проблему отредактировав файл C: \ Program Files (x86) \ Embarcadero \ Studio \ 20.0 \ source \ rtl \ androiddex \ java \ fmx \ src \ com \ embarcadero \ firemonkey \ text \ FMXEditText. java и восстановив Java файлы, необходимые для Delphi Android приложений. Это позволяет клавише Return получать события OnKeyDown и OnKeyUp, как требуется, без необходимости использовать обходной путь TomB.

Что можно изменить в FMXEditText. java

В методе onEditorAction, который имеет только оператор if с кодом в ветвях if и else, выведите код из ветви else и сделайте его безусловным.

Другими словами, где он говорит ( и я публикую репрезентативный фрагмент кода, а не вставляю фактический код, чтобы избежать обвинения в совершении «непослушных» дел):

public void onEditorAction(int actionCode) {
    if (condition) {
        // if block
    } else {
        // else block
    }
}

измените его на:

public void onEditorAction(int actionCode) {
    if (condition) {
        // if block
    }
    // else block
}

Как перестроить Java RTL-файлы

Этот бит немного сложен для go в деталях, но вам нужен командный скрипт, который в основном сделает всю работу за вас. Для исправления проблемы Java в 10.3.0 у меня был командный скрипт, доступный в сообщении в блоге здесь в рамках обсуждения исправляемой проблемы, и для 10.3.3 поста исключительно о том, как восстановить Java files можно найти здесь .

Однако, чтобы избежать комментариев о решениях по внешним ссылкам, которые являются неуместными, так как эти ссылки могут испаряться со временем, вот полный командный скрипт. Проверьте правильность всех путей к переменным, сохраните сценарий в файле с именем BuildFMX.cmd, запустите административную командную строку и оттуда вызовите сценарий:

@echo off
cls

rem Android RTL Java files rebuilder for RAD Studio 10.3.3

setlocal enabledelayedexpansion

rem Set environment variables
rem *NOTE*: check these folders match your setup

set EMBT=Embarcadero\Studio\20.0
set BDS=%ProgramFiles(x86)%\%EMBT%
set JAVA_PATH=%ProgramFiles%\Java\jdk1.8.0_60\bin
rem This is the default path for the Android SDK when installed from the .iso installer
set SDK_PATH=%PUBLIC%\Documents\%EMBT%\PlatformSDKs\android-sdk-windows
if not exist "%SDK_PATH%\" (
  rem This is the default path for the Android SDK when installed from the web install (aka ESD install)
  set SDK_PATH=%PUBLIC%\Documents\%EMBT%\CatalogRepository\AndroidSDK-2525_20.0.36039.7899
)

rem Set more environment variables based on those above

set DX_PATH=%SDK_PATH%\build-tools\28.0.2
set ANDROID_JAR=%SDK_PATH%\platforms\android-26\android.jar
set BDS_LIB=%BDS%\lib
set BDS_DEBUG_LIB=%BDS%\lib\android\debug
set BDS_RELEASE_LIB=%BDS%\lib\android\release
set FMX_SRC_PATH=%BDS%\source\rtl\androiddex\java\fmx
set CLASS_PATH=%ANDROID_JAR%
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\android-support-v4.jar
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\cloud-messaging.jar
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\com-google-android-gms.play-services-base.16.0.1.jar
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\com-google-android-gms.play-services-maps.16.1.0.jar
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\debug\com-google-android-gms.play-services-ads.17.2.0.jar
rem For adListener
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\com-google-android-gms.play-services-ads-lite.17.2.0.jar
rem For AbstractSafeParcelable
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\com-google-android-gms.play-services-basement.16.2.0.jar
rem For ReflectedParcelable
set CLASS_PATH=%CLASS_PATH%;%BDS_DEBUG_LIB%\com-google-android-gms.play-services-basement.16.2.0.jar

echo.
echo Checking environment variables

if not exist "%BDS%\" (
  echo Path used to set BDS environment variable does not exist^^! Is RAD Studio installed elsewhere?
  goto :Error
)

if not exist "%JAVA_PATH%\" (
  echo Path used to set JAVA_PATH environment variable does not exist^^! Is the JDK installed elsewhere?
  goto :Error
)

if not exist "%SDK_PATH%\" (
  echo Path used to set SDK_PATH environment variable does not exist^^! Is the Android SDK installed elsewhere?
  goto :Error
)

if not exist "%ANDROID_JAR%" (
  echo Path used to set ANDROID_JAR environment variable does not exist^^! Is your android.jar in a different platform folder?
  goto :Error
)

echo.
echo Changing to the FMX source folder
echo.

pushd %FMX_SRC_PATH%

echo Getting fully qualified list of all Java source file we need to rebuild
echo.

if not exist bin\classes mkdir bin\classes
if not exist bin\debug mkdir bin\debug
if not exist bin\release mkdir bin\release
dir src\android\bluetooth\*.java /s /b > JavaSources.txt
dir src\android\telephony\*.java /s /b >> JavaSources.txt
dir src\com\*.java /s /b >> JavaSources.txt

echo Ensuring FMX source path ends in a '\'
echo.

set LAST_CHAR=%FMX_SRC_PATH:~-1%
if not "%LAST_CHAR%"=="\" set FMX_SRC_PATH=%FMX_SRC_PATH%\

echo Making Java source file paths relative to current directory
echo.

if exist JavaSources2.txt del JavaSources2.txt
for /F "tokens=*" %%A in (JavaSources.txt) do (
  set STR=%%A
  set "STR=!STR:%FMX_SRC_PATH%=!"
  echo !STR!>>JavaSources2.txt
)

echo Compiling all the FMX Java code into class files with debug info
echo.

"%JAVA_PATH%"\javac -g -d bin\classes -classpath "%CLASS_PATH%" -encoding UTF-8 -g @JavaSources2.txt
if errorlevel 1 (
  echo.
  echo Problem encountered during Java compilation
  goto :Error
)

echo.
echo Creating jar containing the new compiled FMX Java classes with debug info
echo.

"%JAVA_PATH%"\jar cf bin\debug\fmx.jar -C bin\classes .
if errorlevel 1 (
  echo.
  echo Problem encountered during Java archiving
  goto :Error
)

echo Creating DEX jar containing the new compiled FMX Java classes with debug info
echo.

call %DX_PATH%\dx --dex --output=bin\debug\fmx.dex.jar --positions=lines bin\debug\fmx.jar
if errorlevel 1 (
  echo.
  echo Problem encountered during DEXing
  goto :Error
)

echo Compiling all the FMX Java code into class files without debug info
echo.

"%JAVA_PATH%"\javac -g:none -d bin\classes -classpath "%CLASS_PATH%" -encoding UTF-8 @JavaSources2.txt
if errorlevel 1 (
  echo.
  echo Problem encountered during Java compilation
  goto :Error
)

echo.
echo Creating jar containing the new compiled FMX Java classes without debug info
echo.

"%JAVA_PATH%"\jar cf bin\release\fmx.jar -C bin\classes .
if errorlevel 1 (
  echo.
  echo Problem encountered during Java archiving
  goto :Error
)

echo Creating DEX jar containing the new compiled FMX Java classes without debug info
echo.

call %DX_PATH%\dx --dex --output=bin\release\fmx.dex.jar --positions=lines bin\release\fmx.jar
if errorlevel 1 (
  echo.
  echo Problem encountered during DEXing
  goto :Error
)

copy bin\debug\* "%BDS_DEBUG_LIB%"
copy bin\release\* "%BDS_RELEASE_LIB%"

echo Tidying up...
echo.
if exist JavaSources.txt del JavaSources.txt
if exist JavaSources2.txt del JavaSources2.txt
rd /s /q bin

goto :End

:Error
echo.
echo Sorry, we had a problem :(
echo.

:End

echo Changing back to the folder we started in

popd

endlocal
...