首页 > 解决方案 > Xamarin:有没有办法区分滑动和底部导航视图点击?

问题描述

我想知道是否可以区分 Xamarin.Android 中的 BottomNavigationView 上的滑动和单击。

我已经实现:

    void NavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
    {
        if (_viewPager.CurrentItem == 0)
        {
            _fm1.Pop2Root();
        }

        _viewPager.SetCurrentItem(e.Item.Order, true);


    }

但是滑动和点击之间没有区别。如果用户滑动,我想保持当前页面的加载,但如果用户单击了当前选择的 BottomNavigationView 选项卡,则弹出到根目录。

这就是我的 Pop2Root 方法的样子(这并不重要):

    public void Pop2Root()
    {
        _wv.LoadUrl("https://www.bitchute.com/");
    }

我只想要一个单独的点击和滑动事件。

我不是在寻找任何人来做我的工作。一旦我弄清楚了,我将发布完整的解决方案(一如既往)。我正在寻找的是一个是或否的答案,无论它是否可能;然后我会照顾其余的。我之前在 TabHost 上实现了一个点击监听器,但这是一个完全不同的 UI 元素:

https://github.com/hexag0d/BitChute_Mobile_Android_a2/blob/2.7641/Activities/ClickListeners.cs

如果您想了解整个项目的更多上下文,这里是 MainActivity.cs,然后您可以回到其余部分:

https://github.com/hexag0d/BitChute_Mobile_Android_BottomNav/blob/master/MainActivity.cs

提前致谢

标签: c#xamarin.androidbottomnavigationview

解决方案


这个问题的答案是肯定的。用户滑动时调用 ViewPager_PageSelected 方法。NavigationView_NavigationItemSelected 在标签按下时调用。有趣的是,如果将 ViewPager_PageSelected 方法放在NavigationView_NavigationItemSelected 方法之前,则在用户按下选项卡时不会调用 ViewPager_PageSelected ,直到调用此方法之后:

_viewPager.SetCurrentItem(e.Item.Order, true);

之后,ViewPager_PageSelected 方法被调用并且 NavigationView_NavigationItemSelected 被再次调用。所以我决定这样做并设置一个自定义 int。这样,这两种方法在每次用户交互时只调用一次,并且存在差异。

(注意事件 BottomNavigationView.NavigationItemSelectedEventArgs & ViewPager.PageSelectedEventArgs)

//put all of this inside your MainActivity.cs 
int _tabSelected;

void NavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
{
     if (_tabSelected == e.Item.Order)
     {
         switch (_viewPager.CurrentItem)
         {
             case 0:
                 _fm1.Pop2Root();
                 break;
             case 1:
                 _fm2.Pop2Root();
                 break;
             case 2:
                 _fm3.Pop2Root();
                 break;
             case 3:
                 _fm4.Pop2Root();
                 break;
             case 4:
                 _fm5.Pop2Root();
                 break;
          }
     }
     else
     {
         _viewPager.SetCurrentItem(e.Item.Order, true);
     }
}

private void ViewPager_PageSelected(object sender, ViewPager.PageSelectedEventArgs e)
{
   _menu = _navigationView.Menu.GetItem(e.Position);
   _navigationView.SelectedItemId = _menu.ItemId;

   _tabSelected = _viewPager.CurrentItem;
}

推荐阅读