델파이에서 안드로이드의 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;
'Program > Delphi-FireMonkey' 카테고리의 다른 글
[Delphi-FireMonkey] 안드로이드(Android) 뒤로가기 버튼 두번 눌러서 종료 (3) | 2015.02.24 |
---|---|
[Delphi-FireMonkey] 안드로이드(Android) 리소스(Resource) 접근 및 이미지 적용 (2) | 2015.02.17 |