如何在按下设备后退按钮时使HybridWebView返回

时间:2016-04-21 16:11:43

标签: android-webview xamarin.forms

我在Droid项目中有一个带有HybridWebView和HybridWebViewRenderer的Xamarin.Forms应用程序。

当我按下设备的后退按钮时,我试图让网页视图导航回来。

如果我只是在页面中使用Xamarin.Forms WebView,那看起来很简单。我会这样做......

protected override bool OnBackButtonPressed()
{
    _webView.GoBack();
    return true;
}

但是HybridWebView没有GoBack()方法。

在我的Droid项目中,唯一可以访问WebView的地方是HybridWebViewRenderer,但是我不能在这里监听OnBackButtonPressed事件。

任何人都知道如何在按下设备的后退按钮时将HybridWebView导航回去?

2 个答案:

答案 0 :(得分:2)

从Javascript调用.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry)) .Where(d => d.HasValue) .Select(d => d.Value) .ToList(); 可能是一个肮脏的解决方案。

此外,从PCL类调用渲染器方法应该不是问题。

PCL课程:

window.history.back();

渲染器:

public class MyHybridWebView : HybridWebView
{
    public event EventHandler<EventArgs> DoSomeNative;

    public void CallNative()
    {
        DoSomeNative(this, EventArgs.Empty);
    }
}

答案 1 :(得分:0)

我有效的解决方案如下:

HybridWebView扩展了View: 我创建了2个事件监听器和1个bool属性。

public event EventHandler<EventArgs> GoBackOnNativeEventListener;
public event EventHandler<EventArgs> CanGoBackOnNativeEventListener;
public bool _CanGoBack { get; set; }

方法:

public bool GoBack()
{
    GoBackOnNative();
    return true;
}
private void GoBackOnNative()
{
    GoBackOnNativeEventListener(this, EventArgs.Empty);
}
public bool CanGoBack()
{
    CanGoBackOnNative();
    return _CanGoBack;
}
private void CanGoBackOnNative()
{
    CanGoBackOnNativeEventListener(this, EventArgs.Empty);            
}

在iOS渲染中 公共类WebViewRender:HybridWebViewRenderer     {         受保护的重写void OnElementChanged(ElementChangedEventArgs e)         {             base.OnElementChanged(e);             if(控件!= null && e.NewElement!= null)             {                 InitializeCommands((ClickableWebView)e.NewElement);             }         }

    private void InitializeCommands(ClickableWebView element)
    {
        element.RefreshCommand = () =>
        {
            Control?.Reload();
        };

        element.GoBackCommand = () =>
        {
            var ctrl = Control;
            if (ctrl == null)
                return;

            if (ctrl.CanGoBack)
                ctrl.GoBack();
        };

        element.CanGoBackFunction = () =>
        {
            var ctrl = Control;
            if (ctrl == null)
                return false;

            return ctrl.CanGoBack;
        };

        element.CanGoForwardFunction = () =>
        {
            var ctrl = Control;
            if (ctrl == null)
                return false;

            return ctrl.CanGoForward;
        };
        element.GoFrowardCommand = () =>
        {
            var ctrl = Control;
            if (ctrl == null)
                return;

            if (ctrl.CanGoForward)
                ctrl.GoForward();
        };
    }
}

在渲染器上,我绑定了侦听器:

e.NewElement.GoBackOnNativeEventListener += (sender, args) =>
{
    Control.GoBack(); 
};
e.NewElement.CanGoBackOnNativeEventListener += (sender, args) =>
{
    _cangoback = Control.CanGoBack();
    var hybridWebView = Element as HybridWebView;
    hybridWebView._CanGoBack = _cangoback;
};

最后在xaml.cs上,在方法OnBackButtonPressed()上,我喜欢:

if (hybridWebView.CanGoBack())
{
    hybridWebView.GoBack();
    return true;
}
else
    return base.OnBackButtonPressed();