Nativescript WebView,在Android

时间:2017-06-12 23:01:55

标签: javascript android webview nativescript

所以我设置了一个页面,并希望使用应用程序与网页进行交互。

我可以通过侦听某些网址从页面获取数据,并阻止网页进行网页浏览。

当我获得此数据时,我会导航到包含已处理列表的新页面。

然后当我单击后退按钮返回浏览器页面时,即使已经设置了URL,浏览器也会重新加载。

非常简单的设置:

的xml:

<Page loaded="loaded" class="page">
    <Page.actionBar>
        <ActionBar title="Cost" icon="" class="action-bar">
        </ActionBar>
    </Page.actionBar>
    <WebView id="mywebview" />
</Page>

JS:

var checkPageLoad = function(event) {
  console.log(event.url);
  if (event.url.indexOf("mydomain") < 0) {
    if (app.ios) {
        event.object.ios.stopLoading();
    } else if (app.android) {
        event.object.android.stopLoading();
    }
  }
  if (event.url.indexOf('custom://mydomain.com') === 0 ) {

    farm(event.url.replace("custom://mydomain.com", ""));

  }
};
exports.loaded = function(args) {
  page = args.object;
  var web = page.getViewById("mywebview");
  web.on(webView.WebView.loadStartedEvent, checkPageLoad);
  if(web.android) { // in IOS android will be undefined
    web.android.setInitialScale(1);
    web.android.getSettings().setLoadWithOverviewMode(true);
    web.android.getSettings().setUseWideViewPort(true);
  }
  if (web.src != "http://myurl.com") {
    web.src = "http://myurl.com";
  }
};
function farm(item) {

  var navigationOptions={
    moduleName:'./list/list',
    context:{info: item},
    animated: true,
    transition: {
        name: "slide",
        duration: 380,
        curve: "easeInOut"
    }
  };
  var topmost = frameModule.topmost();

  topmost.navigate(navigationOptions);
}

所以,当我按下&#34;列表中的后退按钮&#34;页面,webview在重新加载时是白色的。

任何想法?它与frameModule导航有关吗?

=============================================== =

更新6/29/17:

我已针对此问题实施了解决方法。它不是最好的,但它使它工作满意。

要解决方法:使用NativeScripts page的{​​{1}}功能。 http://docs.nativescript.org/core-concepts/navigation#modal-pages

这会创建一个弹出窗口,当按下后退时会关闭弹出窗口而不重新加载webview。

为了实现,我不得不改变我的网页设置方式。

一次只能打开1个模态页面,因此每个视图都需要与webview页面进行通信。

页面也有一个事件showModal(),它将上下文与框架模块稍有不同。

您必须将发送的回调存储到模态页面,并在模态页面关闭时调用它。

仍然希望只使用帧模块设置。

2 个答案:

答案 0 :(得分:1)

后退按钮使最后一个视图从onPause状态转换为onResume,然后转换为running状态。如果您有权访问onResume事件,则可以覆盖它或处理它,以便在按下后退时不会发生重新加载。例如,你可以有一个布尔值,例如isLoadFinished(您可以在加载页面时将其设置为true)并在onStartonResume个事件被触发时进行检查,以防止调用webview.load isLoadFinishedtrue

我不是nativeScript开发人员,因此我提出了解决方案的概念。我在nativeScript的Android应用生命周期事件中找到了this guide,我猜它可能对你有帮助。

答案 1 :(得分:0)

was a bug in NativeScript's tns-core-modules

在公开发布版(可能是3.2版)中可以使用修补程序之前,您可以像这样使用tns-core-modules的@next版本:

tns plugin remove tns-core-modules
npm i tns-core-modules@next --save