본문 바로가기

Program/Delphi-FireMonkey

[Delphi-FireMonkey] 안드로이드(Android) Toast API 적용

델파이에서 안드로이드의 Toast가 왜 안되나 했다..

안드로이드에서 Toast는 android.widget.Toast 클래스에서 정의되어 API로 지원하고 있다. 그래서 델파이에서 uses절에 'Androidapi.JNI.Widget'를 입력하고 안드로이드의 Toast 기능을 사용하려고 했는데... Toast가 없었다;; 


이상해서 'Androidapi.JNI.Widget'에 들어가 봤는데...





없다... Toast가 없다. 알아보니 파이어몽키에서 안드로이드의 모든 API를 지원하는 것이 아니란다. 때문에 이런 경우에는 직접 안드로이드 API에 접근하여 사용할 수 있도록 해야 한다... (... 이런 점은 정말 불편하다...)


직접 불러오는 소스를 구현해도 상관 없지만...구글 검색을 하면 Toast API를 불러오는 소스를 쉽게 구할 수 있다.


출처 : https://github.com/hjfactory/FMX.Devgear/blob/master/Libraries/rtl/Android/Android.JNI.Toast.pas


Android.JNI.Toast.Pas

unit Android.JNI.Toast;


interface


{$IFDEF ANDROID}

uses

  Androidapi.JNIBridge,

  Androidapi.JNI.JavaTypes,

  Androidapi.JNI.GraphicsContentViewText;


type

  JToast = interface;


  JToastClass = interface(JObjectClass)

  ['{F227353E-DCE9-404B-8129-6B1BEFE68151}']

    {Property methods}

    function _GetLENGTH_LONG: Integer; cdecl;

    function _GetLENGTH_SHORT: Integer; cdecl;

    {Methods}

    function init(context: JContext): JToast; cdecl; overload;

    function makeText(context: JContext; text: JCharSequence;

      duration: Integer): JToast; cdecl;

    {Properties}

    property LENGTH_LONG: Integer read _GetLENGTH_LONG;

    property LENGTH_SHORT: Integer read _GetLENGTH_SHORT;

  end;


  [JavaSignature('android/widget/Toast')]

  JToast = interface(JObject)

  ['{FC9B3DFD-38CC-4693-9F11-7F3E3647683F}']

    {Methods}

    procedure cancel; cdecl;

    function getDuration: Integer; cdecl;

    function getGravity: Integer; cdecl;

    function getHorizontalMargin: Single; cdecl;

    function getVerticalMargin: Single; cdecl;

    function getView: JView; cdecl;

    function getXOffset: Integer; cdecl;

    function getYOffset: Integer; cdecl;

    procedure setDuration(value: Integer); cdecl;

    procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl;

    procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl;

    procedure setText(s: JCharSequence); cdecl;

    procedure setView(view: JView); cdecl;

    procedure show; cdecl;

  end;

  TJToast = class(TJavaGenericImport<JToastClass, JToast>) end;

{$ENDIF}


implementation


end.


소스를 보면 파이어몽키에서 지원하는 다른 안드로이드 API처럼 Toast API를 불러오는 것을 알 수 있다.

위 Pas 파일을 uses절에 불러놓고, 다음과 같이 사용.





procedure TForm1.Button2Click(Sender: TObject);

var

  tempToast : TJToast;

begin

  CallInUiThread(

    procedure

    begin

      tempToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence('[Test Android Toast!!]'),

        TJToast.JavaClass.LENGTH_SHORT).show;

    end);

end;