2017-05-10 128 views
0

我正在建立一个应用程序在哪里我使用BottomNavigationView并显示片段与ViewPager。BottomNavigationView设置选项与ViewPager选择Xamarin

当我推动或触摸底部导航的臀部时,我没有问题,片段在viewpager中正确显示。

问题是我只能滑动viewPager,当我这样做时,底部导航不会更改为正确的选项。

我看到了,我需要添加ViewPager.IOnPageChangeListener并创建三个方法管理视图寻呼机,但现在我不如何设置BottomNavigation项目选择,当用户滑动viewpager 例如,我碰buttom 4 BottomNavigationBar和我在视图分页器(我显示文本“Fragment4”)中看到了片段4,然后我滑动ViewPager直到Fragment1,但BottomNavigation仍然是选项4,它当我滑动UU

我希望你能帮助我viewpager不改变,感谢

public class MainActivity : AppCompatActivity, ViewPager.IOnPageChangeListener 
{ 

    private DrawerLayout drawerLayout; 
    ViewPager viewPager; 
    BottomNavigationView bottomNavigation; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView (Resource.Layout.Main); 

     bottomNavigation = FindViewById<BottomNavigationView>(Resource.Id.bottom_navigation); 
     bottomNavigation.NavigationItemSelected += Navigation_NavigationItemSelected; 

     SupportToolbar toolbar = FindViewById<SupportToolbar>(Resource.Id.toolbar); 
     SetSupportActionBar(toolbar); 

     SupportActionbar actionBar = SupportActionBar; 
     actionBar.SetHomeAsUpIndicator(Resource.Drawable.ic_menu); 
     actionBar.SetDisplayHomeAsUpEnabled(true); 

     drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawerLayout); 

     NavigationView navigationView = FindViewById<NavigationView>(Resource.Id.nav_view); 
     if (navigationView != null) 
     { 
      setUpDrawerContent(navigationView); 
     } 

     //TabLayout tabs = FindViewById<TabLayout>(Resource.Id.tabs); 

     viewPager = FindViewById<ViewPager>(Resource.Id.viewpager); 
     setUpViewPager(viewPager); 

     //tabs.SetupWithViewPager(viewPager); 


    } 

    private void Navigation_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e) 
    { 
     switch (e.Item.ItemId) 
     { 
      case Resource.Id.navigation_myState: 
       viewPager.SetCurrentItem(0, false); 
       break; 
      case Resource.Id.navigation_study: 
       viewPager.SetCurrentItem(1, false); 
       break; 
      case Resource.Id.navigation_flashcards: 
       viewPager.SetCurrentItem(2, false); 
       break; 
      case Resource.Id.navigation_test: 
       viewPager.SetCurrentItem(3, false); ; 
       break; 
     } 
    } 

    private void setUpViewPager(ViewPager viewPager) 
    { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(SupportFragmentManager); 
     adapter.AddFragment(new Fragment1(), "Fragment1"); 
     adapter.AddFragment(new Fragment2(), "Fragment2"); 
     adapter.AddFragment(new Fragment3(), "Fragment3"); 
     adapter.AddFragment(new Fragment4(), "Fragment4"); 

     viewPager.Adapter = adapter; 
    } 

    public override bool OnOptionsItemSelected(IMenuItem item) 
    { 
     switch (item.ItemId) 
     { 
      case Android.Resource.Id.Home: 
       drawerLayout.OpenDrawer((int)GravityFlags.Left); 
       return true; 

      default: 
       return base.OnOptionsItemSelected(item); 
     } 


    } 

    private void setUpDrawerContent(NavigationView navigationView) 
    { 
     navigationView.NavigationItemSelected += (object sender, NavigationView.NavigationItemSelectedEventArgs e) => 
     { 
      e.MenuItem.SetChecked(true); 
      drawerLayout.CloseDrawers(); 
     }; 
    } 


    public class ViewPagerAdapter : FragmentPagerAdapter 
    { 
     public List<SupportFragment> Fragments { get; set; } 
     public List<string> FragmentsNames { get; set; } 

     public ViewPagerAdapter(SupportFragmentManager FragManager) : base (FragManager) 
     { 
      Fragments = new List<SupportFragment>(); 
      FragmentsNames = new List<string>(); 
     } 

     public void AddFragment(SupportFragment fragment, string name) 
     { 
      Fragments.Add(fragment); 
      FragmentsNames.Add(name); 
     } 

     public override int Count 
     { 
      get 
      { 
       return Fragments.Count; 
      } 
     } 

     public override SupportFragment GetItem(int position) 
     { 
      return Fragments[position]; 
     } 

     public override ICharSequence GetPageTitleFormatted(int position) 
     { 
      return new Java.Lang.String(FragmentsNames[position]); 
     } 
    } 





    public void OnPageScrollStateChanged(int state) 
    { 
     throw new NotImplementedException(); 
    } 

    public void OnPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
    { 
     throw new NotImplementedException(); 
    } 

    public void OnPageSelected(int position) 
    { 
     //I think that here I need to put something like bottomNavigatin.setItemselecte(position) or (bottomNavigation.something(Resource.Id.navigation_flashcards) 
    } 
} 

回答

0

诀窍是将ViewPager.PageSelected连接到BottomNavigationView.NavigationItemSelected。这里是你如何能做到这

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

void NavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e) 
{ 
    _viewPager.SetCurrentItem(e.Item.Order, true); 
} 

演示:

enter image description here

结帐在我的岗位全面推行这里:https://intelliabb.com/2017/12/02/tutorial-bottomnavigationview-and-viewpager-in-xamarin-android/