我正在尝试在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
注意:这些文件中的代码不能反映这些更改,因为它是已发布的应用程序,因此我不会提交垃圾内容。
答案 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中使用。