C'est un mémo, donc c'est divers.
--Xamarin.Forms + WebView (HTML, JavaScript SPA) Application native Gawa --Je souhaite activer / désactiver la touche RETOUR des applications Android en fonction de l'état de la page dans WebView.
ʻAction <TaskCompletionSource <bool >> OnRequestIsEnableBackKey {get; set;}
[Côté formulaires] Développez également `` Task
public Task<bool> IsEnableBackKeyAsync()
{
var comp = new TaskCompletionSource<bool>();
if (OnRequestIsEnableBackKey != null)
{
OnRequestIsEnableBackKey.Invoke(comp);
}
else
{
comp.SetResult(false);
}
return comp.Task;
}
Quatre. Créez un JavaScriptHandler en vous référant à Lier JavaScript avec WebView de Xamarin.Forms (avec iOS / Android commun) --Qiita. En plus de Control dans le constructeur, passez `ʻe.NewElement as WebViewEx. Le nom de l'argument est
WebViewEx externe ''. Le deuxième argument de AddJavascriptInterface doit être `` GawaApp ''.
Cinq. Écrivez le code pour recevoir OnRequestIsEnableBackKey dans le constructeur de JavaScriptHandler.
private TaskCompletionSource<bool> isEnableBackKeyComp = null;
public JavaScriptHandler(Android.Webkit.WebView webView, WebViewEx outer)
{
outer.OnRequestIsEnableBackKey = comp =>
{
isEnableBackKeyComp = comp;
//Erreur s'il n'est pas appelé depuis le thread principal
webView.Post(() =>
{
webView.EvaluateJavascript("window.requestIsEnableBackKey()", null);
// webView.LoadUrl("javascript:window.requestIsEnableBackKey();");← C'est toujours OK
});
};
}
Dans le processus jusqu'à présent, lorsque ʻawait webViewEx.IsEnableBackKeyAsync ()
est appelé du côté Formulaires, la fonction JavaScript`` window.requestIsEnableBackKey ()
est appelée.
[Export]
[Android.Webkit.JavascriptInterface]
public void onResultIsEnableBackKey(bool value)
{
isEnableBackKeyComp?.SetResult(value);
isEnableBackKeyComp = null; // one shot
}
L'appel de `` GawaApp.onResultIsEnableBackKey (true ou false) '' du côté JavaScript rappelle cette méthode. Si vous définissez une valeur sur isEnableBackKeyComp, qui est une TaskCompletionSource, le résultat de «attend webViewEx.IsEnableBackKeyAsync ()» du côté Formulaires est renvoyé.
window.requestIsEnableBackKey = () => {
//Traiter quelque chose
GawaApp.onResultIsEnableBackKey(true or false);
}
Je l'ai implémenté à mi-chemin, mais je l'ai abandonné car c'était gênant (je pensais que l'unidirectionnel est plus simple de JavaScript à C #), donc je ne laisserai que l'idée.