Xamarin:如何扩展WebView?

时间:2019-06-07 00:28:53

标签: c# webview xamarin.android extend

我正在尝试在Xamarin.Android中扩展WebView,但遇到以下异常:

无法将类型为“ Android.Webkit.WebView”的实例转换为类型为“ BottomNavigationViewPager.Fragments.TheFragment1 + ExtWebView”。

我想知道是否/如何扩展WebView。

我尝试实现以下代码;对于WebViewClient扩展,类似的功能可以正常工作,但对于WebView则无效:

public class TheFragment1 : Fragment
{
    // this would run fine ->> protected static WebView _wv;
    protected static ExtWebView _wv;
    protected static View _view;

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {

        _view = inflater.Inflate(Resource.Layout.TheFragmentLayout1, container, false);
                   //the exception happens next line, works fine with a non-extended WebView
        _wv = _view.FindViewById<ExtWebView>(Resource.Id.webView1);

    }

    public class ExtWebView : WebView
    {
        protected ExtWebView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {
        }

        public override void OnWindowFocusChanged(bool hasWindowFocus)
        {
            base.OnWindowFocusChanged(hasWindowFocus);

            this.Visibility = ViewStates.Visible;
        }

        public override void OnPause()
        {
            base.OnPause();

            this.Visibility = ViewStates.Visible;
        }

    }
 }

我还尝试过更改axml文件中的WebView来标记ExtWebView而不是WebView:

<com.bitchute.BottomNavigationViewPager.Fragments.TheFragment1.ExtWebView
    android:id="@+id/webView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

例外:

Android.Views.InflateException:二进制XML文件行1:二进制XML文件行1:错误膨胀了com.intelliabb.BottomNavigationViewPager.Fragments.TheFragment1.ExtWebView类

如果我将com.bitchute.BottomNavigationViewPager.Fragments.TheFragment1.ExtWebView切换回WebView,则会出现此异常:

无法将类型为“ Android.Webkit.WebView”的实例转换为类型为“ BottomNavigationViewPager.Fragments.TheFragment1 + ExtWebView”。

在通过View _view的FindViewById <>方法获取WebView的行上

任何建议都很棒

编辑:顺便说一句,如果您想要我的开源项目的更完整的上下文,可以检查此链接。该代码在TheFragment1.cs中。我删除了很多,因为对于我来说,人们浏览整个.cs文件太麻烦了。

https://github.com/hexag0d/BitChute_Mobile_Android_BottomNav/blob/master/Fragments/TheFragment1.cs

https://github.com/hexag0d/BitChute_Mobile_Android_BottomNav/blob/master/Resources/layout/TheFragmentLayout1.axml

注意:这些文件中的代码不能反映这些更改,因为它是已发布的应用程序,因此我不会提交垃圾内容。

1 个答案:

答案 0 :(得分:0)

我想出了如何做到这一点,以防有人感兴趣。我搜索了一会儿,发现有些东西接近但从未完全了解它。这个答案与java android不同。请记住,这是C#/ Xamarin.Android 不是 Xamarin.Forms。如果这被视为重复,我深表歉意,您可以删除该线程。

我创建了一个.cs文件,然后直接在名为ExtWebView.cs的解决方案中进行分类(您可以将其移动到文件夹中,但为简单起见,我将其直接放入MainActivity.cs旁边的解决方案中):

using Android.Content;
using Android.Runtime;
using Android.Util;
using Android.Webkit;
using System;

namespace f00ProjectNamespace
{
public class ExtWebView : WebView
{

    //from what I read you need all of the constructors..
    //so type ExtWebView : WebView then right click on ExtWebView and hit
    //"generate all" *after* adding "using Android.Webkit;"
    public ExtWebView(Context context) : base(context)
    {
    }

    public ExtWebView(Context context, IAttributeSet attrs) : base(context, attrs)
    {
    }

    public ExtWebView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
    {
    }

    public ExtWebView(Context context, IAttributeSet attrs, int defStyleAttr, bool privateBrowsing) : base(context, attrs, defStyleAttr, privateBrowsing)
    {
    }

    public ExtWebView(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes)
    {
    }

    protected ExtWebView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    //now we can override methods inside the WebView like this: =]
    public override void OnWindowFocusChanged(bool hasWindowFocus)
    {
        //this method is invoked when the app changes focus
        base.OnWindowFocusChanged(hasWindowFocus);
    }
}
}

非常重要,在您的布局中,您需要使用以下命名空间标记ExtWebView:f00ProjectNamespace.ExtWebView(其中f00ProjectNamespace显然是您的命名空间);有些人说要使用软件包名称,但这对我不起作用。

<f00ProjectNamespace.ExtWebView
    android:id="@+id/webView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:textAlignment="center"
    android:textSize="@dimen/abc_text_size_display_1_material"
    android:layout_centerVertical="false"/>

在片段中,我得到了这样的WebView:

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var _view = inflater.Inflate(Resource.Layout.TheFragmentLayout1, container, false);

        var _wv = (ExtWebView)_view.FindViewById<ExtWebView>(Resource.Id.webView1);
    }

工作完美,现在没有膨胀错误,并且我有一个扩展的WebView。希望能对您有所帮助,并且可以在19年6月29日的当前版本的Xamarin.Android中使用。