Xamarin: как расширить веб-представление? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь расширить WebView в Xamarin.Android, но получаю следующее исключение:

Не удалось преобразовать экземпляр типа '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;
        }

    }
 }

Я также попытался изменить WebView в моем файле axml, чтобы пометить 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».

в строке, где я получаю WebView через FindViewById <> метод View _view

, любой совет будет отличным

РЕДАКТИРОВАТЬ: кстати, если вы хотите большеполный контекст моего проекта с открытым исходным кодом вы можете проверить эту ссылку.Код находится в 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 голосов
/ 29 июня 2019

Я понял, как это сделать, если кому-то интересно. Я искал некоторое время и находил вещи, которые подошли близко, но так и не получили их полностью Этот ответ не такой, как для 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. Надеюсь, это поможет, работает в текущей версии Xamarin. Android по состоянию на 06/29/19

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...