2017-05-10 1 views
0

BottomNavigationView를 사용하여 ViewPager로 프래그먼트를 표시하는 App을 구축 중입니다.ViewPager Xamarin으로 BottomNavigationView 설정 옵션 선택

아래쪽 탐색 버튼을 밀거나 만질 때 문제가 발생하지 않아 조각이 뷰 페이지에 올바르게 표시됩니다.

문제는 viewPager를 슬라이드 할 수 있고 내가 할 때 아래쪽 탐색이 올바른 옵션으로 변경되지 않는다는 것입니다.

은 내가보기 호출기를 관리하기위한 에게 ViewPager.IOnPageChangeListener를 추가하고 세 가지 방법을 만들 필요가 있다고보고,하지만 사용자가 예를 들어 viewpager 를 밀어 때 선택한 BottomNavigation 항목을 설정하는 방법 지금 해달라고, 내가 터치 buttom 4 BottomNavigationBar과 나는 자동으로 뷰 페이저 (텍스트 "Fragment4"표시)에서 조각 4를 보았습니다. 그런 다음 Fragment1까지 ViewPager를 슬라이드했지만 BottomNavigation은 여전히 ​​선택되어있는 option4입니다. 뷰 페이지를 슬라이드 할 때 변경되지 않음

감사합니다.

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.PageSelectedBottomNavigationView.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/