XAMARIN: Как обновить WebView OnTabReselected? - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь обновить WebView, когда пользователь повторно выбирает вкладку, которая уже выбрана для кодирования Android с помощью Xamarin, с использованием устаревших Actionbar и TabHost.

У меня есть этот код

    public void OnTabReselected(WhatsOnActivity tab, FragmentTransaction ft)
    {
        WebView whatsOnWebView = FindViewById<WebView>(Resource.Id.webViewWhatsOn);
        //tell webview to reload
        whatsOnWebView.Reload();
    }

, и я пытался поместить этот код как в мою MainActivity, так и в My WhatsOnActivity

Это не приводит к сбоюприложение, но оно также не перезагружает вкладку.Могу ли я использовать в Xamarin «WhatsOnActivity» в качестве вкладки в моем методе?У меня такое чувство, что я делаю что-то не так ... но если я пытаюсь использовать идентификаторы табуляции, они не распознаются IDE.Кто-нибудь может подсказать мне, что я сделал неправильно?

мой полный код можно найти здесь:

https://github.com/hexag0d/BitChute_Mobile_Android_a2/blob/2.68/MainActivity.cs

, если вам интересно контекст.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Во-первых, большое спасибо @Billy Liu - MSFT !!!чувак спасательОн знает своего Ксамарина.Итак, вот как вы можете обновить вкладку OnClick

// Сборки

using System;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Widget;
using Android.Webkit;
using static Android.Widget.TabHost;
using static Android.Views.View;
using Android.Views;

//this assembly is your Activities class, which should contain your class instances
using com.xamarin.example.BitChute.Activities;

РЕДАКТИРОВАТЬ: Поместите эти прослушиватели кликов в ваш MainActivity.cs .. int внутри GetChildAt () представляетНа вкладку ответит наш слушатель.int 0 = крайний левый вкладка, и они поднимаются на 0 .. 1 .. 2 ... и т. д. 1 будет означать секунду табуляции слева.Каждому слушателю понадобится собственный экземпляр класса слушателя.В следующем блоке я покажу два примера.

        TabHost tabHost = FindViewById<TabHost>(Android.Resource.Id.TabHost);

        tabHost.Setup();

        tabHost.TabWidget.GetChildAt(0).SetOnClickListener(new WhatsOnClickListener(tabHost));

        tabHost.TabWidget.GetChildAt(1).SetOnClickListener(new SubsClickListener(tabHost));

        tabHost.TabWidget.GetChildAt(2).SetOnClickListener(new DiscoverClickListener(tabHost));

        tabHost.TabWidget.GetChildAt(3).SetOnClickListener(new MyChannelClickListener(tabHost));

        tabHost.TabWidget.GetChildAt(4).SetOnClickListener(new SettingsClickListener(tabHost));

РЕДАКТИРОВАТЬ: создайте отдельный файл ClickActivity.cs, а затем добавьте в него этих слушателей.вам нужно будет создать экземпляр OnClickListener для каждой вкладки.Этот пример только два из слушателей;но если вы используете мой шаблон, вам нужно будет использовать эти примеры для создания еще трех слушателей.

public class WhatsOnClickListener : Java.Lang.Object, IOnClickListener
{
    TabHost tabHost;

    //this int will tell the click listener whether to reload the webview or pop 2 root
    static int tbC = 0;

    public WhatsOnClickListener(TabHost tabHost)
    {
        //tell the clicklistener which tabhost to use
        this.tabHost = tabHost;
    }

    //this class handles the click event
    public void OnClick(View v)
    {

        //declare the webview and tell our object where to find the XAML resource
        WebView webViewWhatsOn = tabHost.CurrentView.FindViewById<WebView>(Resource.Id.webViewWhatsOn);

        //...if the CurrentTab != 0 ... we won't fire the Reload() or LoadUrl() 
        //..without this logic, the app will crash because our WebViews 
        //.aren't set to an instance of an object
        if (tabHost.CurrentTab == 0)
        {
            //if tbC int is 0, we will reload the page
            if (tbC == 0)
            {
                //tell whatsOnWebView to Reload
                webViewWhatsOn.Reload();

                //set the int to one so next time webview will pop to root
                tbC = 1;
            }
            //else if the int is 1, we will pop to root on tab 0
            else if (tbC == 1)
            {
                //tell whatsOnWebView to pop to root
                webViewWhatsOn.LoadUrl(@"https://bitchute.com/");

                //set the tbC int so that next time webview will reload
                tbC = 0;
            }
        }

        //if our current tab isn't zero, we need to set CurrentTab to 0
        //this line is critical or our tabs won't work when not selected
        tabHost.CurrentTab = 0;
    }
}

public class SubsClickListener : Java.Lang.Object, IOnClickListener
{
    TabHost tabHost1;

    static int tbC = 0;

    public SubsClickListener(TabHost tabHost1)
    {
        this.tabHost1 = tabHost1;
    }
    public void OnClick(View v)
    {
        if (tabHost1.CurrentTab == 1)
        {

            WebView subWebView = tabHost1.CurrentView.FindViewById<WebView>(Resource.Id.webViewSubs);

            if (tbC == 0)
            {
                subWebView.Reload();

                tbC = 1;
            }

            else if (tbC == 1)
            {
                subWebView.LoadUrl(@"https://bitchute.com/subscriptions/");

                tbC = 0;
            }
        }

        tabHost1.CurrentTab = 1;
    }
}

надеюсь, что это поможет!Я пытался это в течение минуты.

0 голосов
/ 18 октября 2018

Обновление

Попробуйте установить OnClicklistener на первой вкладке.Установите слушателя после добавления вкладок.

 TabHost.TabWidget.GetChildAt(0).SetOnClickListener(new MyOnClickListener(tabHost));

И слушателя:

    public class MyOnClickListener : Java.Lang.Object, IOnClickListener
    {
        TabHost tabHost;
        public MyOnClickListener(TabHost tabHost)
        {
            this.tabHost = tabHost;
        }
        public void OnClick(View v)
        {

            var parentView = ((ViewGroup)((ViewGroup)tabHost.GetChildAt(0)).GetChildAt(1)).GetChildAt(0);
            WebView whatsOnWebView = parentView.FindViewById<WebView>(Resource.Id.webViewWhatsOn);
            whatsOnWebView.Reload();
            tabHost.CurrentTab = 0;
        }
    }

И результат будет:

enter image description here

Оригинальный ответ

Пожалуйста, попробуйте добавить OnTabChangeListener к вашему TabHost.

Например, в вашей MainActivity OnCreate():

        TabHost tabHost = FindViewById<TabHost>(Android.Resource.Id.TabHost);
        tabHost.SetOnTabChangedListener(new MyOnTabChangedListener(tabHost));

И MyOnTabChangedListener:

    public class MyOnTabChangedListener : Java.Lang.Object, IOnTabChangeListener
    {
        TabHost tabHost;
        public MyOnTabChangedListener(TabHost tabHost)
        {
            this.tabHost = tabHost;
        }

        public void OnTabChanged(string tabId)
        {
            if(tabId == "whats_on")
            {
                var parentView = ((ViewGroup)((ViewGroup)tabHost.GetChildAt(0)).GetChildAt(1)).GetChildAt(0);                    
                WebView whatsOnWebView = parentView.FindViewById<WebView>(Resource.Id.webViewWhatsOn);
                whatsOnWebView.Reload();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...