在Android中,对于BottomNavigationView,是否应具有shouldSelectViewController?

时间:2019-01-15 09:29:16

标签: android ios xamarin.ios xamarin.android bottomnavigationview

我在Android活动中有一个BottomNavigationView,它由4个menuItem组成。当我点击下载菜单时,我检查是否有可用的下载内容,如果可用,我将允许导航发生,如果没有下载的内容,我将显示一个Toast声明该内容,并且希望保持上一个选项卡的选择。在iOS中,我可以使用委托方法shouldSelectViewController来确定是否允许导航。 方法签名指定如下:

- (BOOL)tabBarController:(UITabBarController *)tabBarController 
shouldSelectViewController:(UIViewController *)viewController;

我尝试重新选择先前选择的选项卡,结果,保留了先前的项目,但仍将选择的项目颜色分配给下载选项卡。

    private void BottomNavigationItemSelected(object obj, BottomNavigationView.NavigationItemSelectedEventArgs args)
    {
        Android.Support.V4.App.Fragment fragment = null;
        Android.Support.V4.App.Fragment currentFragment = SupportFragmentManager.FindFragmentById(Resource.Id.content_frame);
        string title = "";
        if (args.Item.ItemId == Resource.Id.menu_explore)
        {
            _selectedToolbarId = args.Item.ItemId;
            title = Resources.GetString(Resource.String.shelf_title);
            fragment = _exploreFragment;
            _fragmentTag = "Home";
        }
        else
        {
            title = args.Item.TitleFormatted.ToString();
        }
        if (args.Item.ItemId == Resource.Id.menu_dashboard)
        {
            //COULD BE MADE CONFIGURABLE
            //fragment = _dashboardFragment;
            _selectedToolbarId = args.Item.ItemId;
            fragment = _redesignDashboard;
            _fragmentTag = "Dashboard";
        }
        else if (args.Item.ItemId == Resource.Id.menu_more)
        {
            _selectedToolbarId = args.Item.ItemId;
            fragment = _moreFragment;
            _fragmentTag = "More";
        }
        else if (args.Item.ItemId == Resource.Id.menu_report)
        {
            _selectedToolbarId = args.Item.ItemId;
            fragment = _reportFragment;
            _fragmentTag = "Report";
        }
        else if (args.Item.ItemId == Resource.Id.menu_downloads)
        {
            List<Product> _downloadProducts = DBService.GetDB().GetDownloadedProducts();
            if (_downloadProducts == null || _downloadProducts.Count == 0)
            {
                _bottomNavigationView.SelectedItemId = _selectedToolbarId;
                Toast.MakeText(this, "No downloaded products", ToastLength.Short).Show();
                args.Item.SetChecked(false);
            }
            else
            {
                _downloadGalleryFragment = new DownloadGalleryFragment(_downloadProducts);
                fragment = _downloadGalleryFragment;
                _fragmentTag = "Downloads";
            }
        }
        if (fragment != null)
        {
            _toolbarTitle.Text = title;
            ToggleTitle(true);
            SupportFragmentManager.BeginTransaction().SetCustomAnimations(Resource.Animation.fab_slide_in_from_right, Resource.Animation.fab_slide_out_to_left).Replace(Resource.Id.content_frame, fragment, _fragmentTag).Commit();
        }
    }

<?xml version="1.0" encoding="UTF-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
      android:id="@+id/menu_explore"
      android:enabled="true"
      android:title="@string/explore"
      android:icon="@drawable/explore_icon"
      app:showAsAction="always" />

    <item
      android:id="@+id/menu_dashboard"
      android:enabled="true"
      android:title="@string/dashboard"
      android:icon="@drawable/Dashboard_new_icon"
      app:showAsAction="always" />

     <item
      android:id="@+id/menu_report"
      android:enabled="true"
      android:title="@string/reports"
      android:icon="@drawable/dashboard_icon"
      app:showAsAction="always" />

     <item
      android:id="@+id/menu_downloads"
      android:enabled="true"
      android:title="@string/menu_downloads"
      android:icon="@drawable/download_icon"
      app:showAsAction="always" />

     <item
      android:id="@+id/menu_more"
      android:enabled="true"
      android:title="@string/more_bottombar"
      android:icon="@drawable/more_icon"
      app:showAsAction="always" />
</menu> 

3 个答案:

答案 0 :(得分:0)

没有这样的委托可以像shouldSelectViewController一样工作,但是您可以做的是获取底部导航栏的菜单项并禁用以下菜单项:

类似这样的东西:

var listMenuItems = new List<IMenuItem>();
for (int i = 0; i < bottomNav.Menu.Size(); i++)
{
   listMenuItems.Add(bottomNav.Menu.GetItem(i));
}

在这里放置它们后,您可以随意对其进行操作,只需使用SetEnabled方法,该方法以boolean作为参数即可启用或禁用某项。

答案 1 :(得分:0)

似乎是Android或底部导航视图出现问题。当我在稍稍延迟50毫秒后执行前一个片段的重选时,它的工作正常。即重新选择的片段或先前的片段图标会根据需要突出显示。

if (args.Item.ItemId == Resource.Id.menu_downloads)
            {
                List<Product> _downloadProducts = DBService.GetDB().GetDownloadedProducts();
                if (_downloadProducts == null || _downloadProducts.Count == 0)
                {

                   _readProgressTimerTask = new Timer
                    {
                        Enabled = true,
                        Interval = 50,
                        AutoReset = false
                    };
                    _readProgressTimerTask.Elapsed += OnProgressCheckTimeElapsed;
                    Toast.MakeText(this, this.Resources.GetString(Resource.String.no_downloads), ToastLength.Short).Show();
                }
                else
                {
                    _downloadGalleryFragment = new DownloadGalleryFragment(_downloadProducts);
                    fragment = _downloadGalleryFragment;
                    _fragmentTag = "Downloads";
                }
            }

private void OnProgressCheckTimeElapsed(System.Object source, ElapsedEventArgs args)
        {
            this.RunOnUiThread(() =>
            {
                _bottomNavigationView.SelectedItemId = _selectedToolbarId;
            });
        }

答案 2 :(得分:0)

我建议您首先阅读准则available here,以实现针对Android的底部导航

您想要的内容没有多大意义,应该显示一个空白屏幕,显示诸如“没有可用的内容”或您喜欢的消息。

在此链接BottomNavigationView中,您可以找到可以设置为底部导航的所有公共方法和侦听器。对于您的情况,您可能有兴趣添加这两个。

setOnNavigationItemReselectedListener()

setOnNavigationItemSelectedListener()

最诚挚的问候,佩德罗