C# Xamarin:有没有办法区分滑动和底部导航视图单击?

C# Xamarin:有没有办法区分滑动和底部导航视图单击?,c#,xamarin.android,bottomnavigationview,C#,Xamarin.android,Bottomnavigationview,我想知道是否有可能在Xamarin.Android中区分滑动和点击底部导航视图 //put all of this inside your MainActivity.cs int _tabSelected; void NavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e) { if (_tabSelected == e.I

我想知道是否有可能在Xamarin.Android中区分滑动和点击底部导航视图

//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;
}
我实施了:

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

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


    }
//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;
}
但刷卡和点击之间没有区别。如果用户滑动,我希望保持当前页面加载,但是如果用户单击了当前选择的BottomNavigationView选项卡,则会弹出到根目录

//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;
}
下面是我的Pop2Root方法的样子(这并不重要):

//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;
}
我只想为点击和刷卡单独设置一个事件

//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;
}
我不想找人做我的工作。我将发布完整的解决方案(一如既往),一旦我找到了它。我所寻找的是一个肯定或否定的答案,无论这是否可能;那剩下的就交给我了。我以前在TabHost上实现过单击侦听器,但这是一个完全不同的UI元素:

//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;
}

//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;
}
如果您想了解完整项目的更多内容,这里是MainActivity.cs,然后您可以回到其余部分:

//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;
}

//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;
}

谢谢,请提前回答这个问题,答案是肯定的。当用户滑动时,将调用ViewPager_PageSelected方法。NavigationView\u NavigationItemSelected在按tab键时调用。有趣的是,如果ViewPager\u PageSelected方法放在NavigationView\u NavigationItemSelected方法之前,则在调用此方法之前,当用户按下a选项卡时,不会调用ViewPager\u PageSelected:

_viewPager.SetCurrentItem(e.Item.Order, true);
//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;
}
在此之后,将调用ViewPager\u PageSelected方法,并再次调用NavigationView\u NavigationItemSelected。所以我决定这样做,并设置一个自定义int。这样,每个用户交互只调用一次这两个方法,这是有区别的

//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;
}
(注意事件底部NavigationView.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;
}

这个问题的答案是肯定的。当用户滑动时,将调用ViewPager_PageSelected方法。NavigationView\u NavigationItemSelected在按tab键时调用。有趣的是,如果ViewPager\u PageSelected方法放在NavigationView\u NavigationItemSelected方法之前,则在调用此方法之前,当用户按下a选项卡时,不会调用ViewPager\u PageSelected:

_viewPager.SetCurrentItem(e.Item.Order, true);
//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;
}
在此之后,将调用ViewPager\u PageSelected方法,并再次调用NavigationView\u NavigationItemSelected。所以我决定这样做,并设置一个自定义int。这样,每个用户交互只调用一次这两个方法,这是有区别的

//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;
}
(注意事件底部NavigationView.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;
}

您要侦听哪个控件的刷卡事件?底部导航视图还是整个布局?Click listener与GestureListener不同,您可以参考此链接。@LeonLu MSFT ok这是一个有用的资源。作为最后手段,我将走那条路。但是我的滑动已经可以正常工作了,我宁愿实现一个IOnClickListener来监听BottomNavigationView子项上的单击。如果我走上面公布的路线,它将需要额外的代码吨。我非常感谢您的回复,如果OnClick实现失败,我可能会这样做。好的,我可以将此评论作为答案发布吗?void NavigationView\u NavigationItemSelected(对象发送者,BottomNavigationView.NavigationItemSelectedEventArgs e){if(\u menu!=null&(\u menu.ItemId==\u viewPager.CurrentItem)){u fm1.WebViewGoBack();}u viewPager.SetCurrentItem(e.Item.Order,true)}private void viewPager_PageSelected(对象发送方,viewPager.PageSelectedEventArgs e){u菜单=_导航视图.menu.GetItem(e.Position)u navigationView.SelectedItemId=u menu.ItemId;}^^^^^但WebViewGoBack()未调用。您要侦听哪个控件的滑动事件?BottomNavigationView或整个布局?Click listener与GestureListener不同,您可以参考此链接。@LeonLu MSFT确定这是一个有用的资源。我将使用该路径作为最后手段。但我的滑动已经工作正常,我宁愿实现IOnClickListener收听在BottomNavigationView子项上的单击。如果我按照上面发布的路线,它将需要大量额外的代码。我非常感谢您的响应,如果OnClick实现失败,我可能会这样做。好的,我可以发布此注释作为答案吗?void NavigationView\u NavigationItemSelected(对象发送者,BottomNavigationView.NavigationItemSelectedEventArgs e){if(_-menu!=null&(_-menu.ItemId==_-viewPager.CurrentItem)){u-fm1.WebViewGoBack();}u-viewPager.SetCurrentItem(e.Item.Order,true)}private-void-viewPager\u-selected(对象发送方,ViewPager.PageSelectedEventArgs e){u-menu=\u-navigationView.menu.GetItem(e.Position);\u-navigationView.SelectedItemId=\u-menu.ItemId;}^^^^^但未调用WebViewGoBack()。