Я проверил ваш код и предупреждения Java-скрипта, не работающие в Crosswalk Web-view, с сообщением об ошибке вроде этого: "Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
"
Вы можете решить эту проблему с помощью обходного пути: поднимите alertDialog в вашем Foo()
и внедрите метод всякий раз, когда вы хотите использовать alert в вашем javascript.
Я написал демо на основе вашего размещенного кода, вы можете попробовать его:
1 экспорт метода Alert()
в Foo для отображения alertDialog
protected override void OnXWalkReady()
{
var fa = this;
var view = new RelativeLayout(this.BaseContext);
var mp = ViewGroup.LayoutParams.MatchParent;
var xwv = new Org.Xwalk.Core.XWalkView(this.BaseContext, this);
view.AddView(xwv);
this.AddContentView(view, new ViewGroup.LayoutParams(mp, mp));
XWalkPreferences.SetValue("enable-javascript", true);
xwv.SetResourceClient(new XWalkResourceClient(xwv));
xwv.SetUIClient(new XWalkUIClient(xwv));
xwv.AddJavascriptInterface(new Foo(this, xwv), "Foo");
xwv.Load("file:///android_asset/index.html", null);
}
}
class Foo : Java.Lang.Object
//, Java.Lang.IRunnable
{
Context context;
XWalkView xwv;
Activity activity;
public Foo(Context context, Org.Xwalk.Core.XWalkView xwv)
{
this.context = context;
this.activity = activity;
this.xwv = xwv;
}
[Org.Xwalk.Core.JavascriptInterface]
//[Export]
/// [JavascriptInterface]
[Java.Interop.Export("Run")]
public void Run(string text, string id)
{
Toast.MakeText(context, text, ToastLength.Long).Show();
}
[Org.Xwalk.Core.JavascriptInterface]
//[Export]
/// [JavascriptInterface]
[Java.Interop.Export("Alert")]
public void Alert(string text)
{
AlertDialog.Builder alert = new AlertDialog.Builder(context);
alert.SetTitle("Alert Message");
alert.SetMessage(text);
alert.SetPositiveButton("OK", (senderAlert, args) =>
{
//Toast.MakeText(context, "OK!", ToastLength.Short).Show();
});
Dialog dialog = alert.Create();
dialog.Show();
}
2 Вызывайте метод Alert () всякий раз, когда вы хотите отобразить предупреждение в index.html, и передайте строку в качестве параметра, чтобы указать, какое сообщение вы хотите предупредить.
index.html:
<body>
<div onclick="clicked()">Say Hello</div>
<script>
function clicked() {
Foo.Alert("This is alert message");
Foo.Run('this test from js', "1");
}
</script>
<select>
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>
</body>