我在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>
答案 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()
最诚挚的问候,佩德罗