Android中的选项卡页面的自定义渲染器:Xamarin Forms

时间:2018-01-24 05:38:35

标签: android xamarin.forms

我正在处理Xamarin.Forms申请。我在iOS中有这个标签页面渲染器:

public class TabbedPageRenderer : TabbedRenderer
{
    private MainPage _page;

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);
        if (e.NewElement != null)
        {
            _page = (MainPage)e.NewElement;
        }
        else
        {
            _page = (MainPage)e.OldElement;
        }

        try
        {
            var tabbarController = (UITabBarController)this.ViewController;

            if (null != tabbarController)
            {
                tabbarController.ViewControllerSelected += OnTabBarReselected;
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception);
        }
    }

    private void OnTabBarReselected(object sender, UITabBarSelectionEventArgs e)
    {

        var tabs = Element as TabbedPage;
        var playTab = tabs.Children[4];

        if (TabBar.SelectedItem.Title == "Play")
        {
            if (tabs != null)
            {
                playTab.Title = "Pause";
                playTab.Icon = "pause.png";
            }
            App.pauseCard = false;

        }
        else 
        {
            if (tabs != null)
            {
                playTab.Title = "Play";
                playTab.Icon = "play.png";
            }
            App.pauseCard = true;
        }
    }
}

这基本上会更改Play标签上的图标以暂停和播放。这在iOS中运行良好。但我正在努力研究如何在Android端使用相同的功能(基本上将其转换为Android)。

我能指出正确的方向吗?基本上帮助我? :-)

注意:我对Android开发很新。

编辑:这就是iOS中的样子。

暂停模式: enter image description here 游戏模式: enter image description here

1 个答案:

答案 0 :(得分:1)

Xamarin的James Montemagno发表了一个blog帖子,解释了如何达到此要求。

基本上,它使用从TabbedPage继承的“自定义”标签,该标签初始化了要在“标签页当前页面已更改”事件UpdateIcons上触发的事件CurrentPageChanged

public class MyTabs : TabbedPage
{
    //always save a reference to the current page
    Page currentPage;
    public MyTabs()
    {
        //create the pages and set the view models
        //you could also do this in the page code behind
        Children.Add(new TabIconsPage
        {
            BindingContext = new Tab1ViewModel
            {
                IsSelected = true
            }
        });
        Children.Add(new TabIconsPage2
        {
            BindingContext = new Tab2ViewModel()
        });

        currentPage = Children[0];

        //Register for page changes
        this.CurrentPageChanged += Handle_CurrentPageChanged;
    }

    //Update the IsSelected state and trigger an Event that anyone can loop into.
    public event EventHandler UpdateIcons;
    void Handle_CurrentPageChanged(object sender, EventArgs e)
    {
        var currentBinding = currentPage.BindingContext as IIconChange;
        if (currentBinding != null)
            currentBinding.IsSelected = false;

        currentPage = CurrentPage;
        currentBinding = currentPage.BindingContext as IIconChange;
        if (currentBinding != null)
            currentBinding.IsSelected = true;

        UpdateIcons?.Invoke(this, EventArgs.Empty);
    }
}

现在Android需要自定义渲染器来订阅UpdateIcons事件并执行图标更改

public class MyTabs : TabbedPage
{
    //always save a reference to the current page
    Page currentPage;
    public MyTabs()
    {
        //create the pages and set the view models
        //you could also do this in the page code behind
        Children.Add(new TabIconsPage
        {
            BindingContext = new Tab1ViewModel
            {
                IsSelected = true
            }
        });
        Children.Add(new TabIconsPage2
        {
            BindingContext = new Tab2ViewModel()
        });

        currentPage = Children[0];

        //Register for page changes
        this.CurrentPageChanged += Handle_CurrentPageChanged;
    }

    //Update the IsSelected state and trigger an Event that anyone can loop into.
    public event EventHandler UpdateIcons;
    void Handle_CurrentPageChanged(object sender, EventArgs e)
    {
        var currentBinding = currentPage.BindingContext as IIconChange;
        if (currentBinding != null)
            currentBinding.IsSelected = false;

        currentPage = CurrentPage;
        currentBinding = currentPage.BindingContext as IIconChange;
        if (currentBinding != null)
            currentBinding.IsSelected = true;

        UpdateIcons?.Invoke(this, EventArgs.Empty);
    }
}