关于toast("再按一次退出")退出程序后:
现在很多应用都是需要再按一次退出按钮后再退出应用,现在下面介绍了如何实现这样的功能,首先我们添加一个单元FMX.Android.JNI.Toast。需要在toast单元中定义一个全局变量TJToast。
unit FMX.Android.JNI.Toast;
interface
{$IFDEF ANDROID}
uses
FMX.Platform.Android,
Androidapi.JNIBridge,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText;
{$ENDIF}
{$IFDEF ANDROID}
type
TToastLength = (LongToast, ShortToast);
JToast = interface;
JToastClass = interface(JObjectClass)
['{69E2D233-B9D3-4F3E-B882-474C8E1D50E9}']
{ 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)
['{FD81CC32-BFBC-4838-8893-9DD01DE47B00}']
{ 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;
var
PToast:JToast;
procedure Toast(const Msg: string; duration: TToastLength = ShortToast);
{$ENDIF}
implementation
{$IFDEF ANDROID}
uses
FMX.Helpers.Android;
procedure Toast(const Msg: string; duration: TToastLength);
var
ToastLength: Integer;
begin
if duration = ShortToast then
ToastLength := TJToast.JavaClass.LENGTH_SHORT
else
ToastLength := TJToast.JavaClass.LENGTH_LONG;
CallInUiThread(
procedure
begin
//TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(Msg),
//ToastLength).show
if not Assigned(PToast) then
PToast:=TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(Msg),
ToastLength)
else
begin
PToast.setDuration(ToastLength);
PToast.setText(StrToJCharSequence(Msg));
end;
PToast.show;
end);
end;
{$ENDIF}
end.
上面的代码另存为 Android.JNI.Toast.pas。
主程序中定义变量IsFirstBack:Boolean;
加入TTimer控件,并定义时间间隔为2000,事件代码为
procedure TfrmMain.tmrForQuitTimer(Sender: TObject);
begin
tmrForQuit.Enabled := False;
IsFirstBack := True;
end;
按返回键退出时代码,会提示“再按一次退出”
procedure TfrmMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
begin
if (Key = vkHardwareBack) or (Key = vkEscape) then
begin
if IsFirstBack then
begin
IsFirstBack := False;
Key := 0;
tmrForQuit.Enabled := True;
Toast('再按一次退出',ShortToast);
end
else
begin
end;
end;
现在很多应用都是需要再按一次退出按钮后再退出应用,现在下面介绍了如何实现这样的功能,首先我们添加一个单元FMX.Android.JNI.Toast。需要在toast单元中定义一个全局变量TJToast。
unit FMX.Android.JNI.Toast;
interface
{$IFDEF ANDROID}
uses
FMX.Platform.Android,
Androidapi.JNIBridge,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText;
{$ENDIF}
{$IFDEF ANDROID}
type
TToastLength = (LongToast, ShortToast);
JToast = interface;
JToastClass = interface(JObjectClass)
['{69E2D233-B9D3-4F3E-B882-474C8E1D50E9}']
{ 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)
['{FD81CC32-BFBC-4838-8893-9DD01DE47B00}']
{ 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;
var
PToast:JToast;
procedure Toast(const Msg: string; duration: TToastLength = ShortToast);
{$ENDIF}
implementation
{$IFDEF ANDROID}
uses
FMX.Helpers.Android;
procedure Toast(const Msg: string; duration: TToastLength);
var
ToastLength: Integer;
begin
if duration = ShortToast then
ToastLength := TJToast.JavaClass.LENGTH_SHORT
else
ToastLength := TJToast.JavaClass.LENGTH_LONG;
CallInUiThread(
procedure
begin
//TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(Msg),
//ToastLength).show
if not Assigned(PToast) then
PToast:=TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(Msg),
ToastLength)
else
begin
PToast.setDuration(ToastLength);
PToast.setText(StrToJCharSequence(Msg));
end;
PToast.show;
end);
end;
{$ENDIF}
end.
上面的代码另存为 Android.JNI.Toast.pas。
主程序中定义变量IsFirstBack:Boolean;
加入TTimer控件,并定义时间间隔为2000,事件代码为
procedure TfrmMain.tmrForQuitTimer(Sender: TObject);
begin
tmrForQuit.Enabled := False;
IsFirstBack := True;
end;
按返回键退出时代码,会提示“再按一次退出”
procedure TfrmMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
begin
if (Key = vkHardwareBack) or (Key = vkEscape) then
begin
if IsFirstBack then
begin
IsFirstBack := False;
Key := 0;
tmrForQuit.Enabled := True;
Toast('再按一次退出',ShortToast);
end
else
begin
end;
end;
end;
原文: http://www.delphitop.com/html/Android/2912.html