Нижняя навигация Xamarin Android не отображается на всех экранах

Я реализовал нижнюю навигацию в Xamarin Android. Мне нужно показывать разные экраны при нажатии каждого значка на нижней панели навигации. Я отлично работаю в основной деятельности, но при выборе элемента нижней навигации, как показать новый экран, сохраняя при этом видимую нижнюю навигацию. При нажатии значка на нижней панели навигации я снова устанавливаю Content, поэтому нижняя панель навигации скрывается (поскольку загружается новый контент, у которого нет нижней панели навигации).

У меня очень мало опыта работы с Xamarin Android, поэтому я не знаю, есть ли что-то вроде страницы макета, которая может содержать нижнюю навигацию.

введите здесь описание изображения

введите здесь описание изображения

Я читал о Framelayout и фрагментах, но не знаю, как реализовать нижнюю навигацию. Любая помощь могла бы быть полезна.


person Gurmeet    schedule 29.01.2019    source источник
comment
Ваш вопрос немного расплывчатый и на него сложно ответить, с небольшими подробностями, но, насколько я понимаю, я скоро добавлю ответ. Поправьте меня, если я ошибаюсь, хотя вы хотите, чтобы при нажатии на вкладку отображались разные страницы, верно?   -  person FreakyAli    schedule 29.01.2019
comment
нижняя панель навигации исчезает, когда я нажимаю любое меню - причина в том, что я снова устанавливаю содержимое при щелчке меню. Должен ли я определять нижнюю панель навигации на каждой странице?   -  person Gurmeet    schedule 29.01.2019
comment
Нет, я обновляю ответ, вы можете проверить его   -  person FreakyAli    schedule 29.01.2019


Ответы (2)


Поскольку вы меняете ContentView своей деятельности, он исчезает:

Вы можете выполнить следующие шаги, чтобы получить BottomNavigationView:

  • Поскольку мы имеем дело с фрагментами, я изменю свой базовый класс MainActivity на Android.Support.V7.App.AppCompatActivity, и да, мы будем использовать библиотеку поддержки Android V4. Поскольку я имею дело с фрагментами, я изменю свой базовый класс MainActivity на Android.Support.V7.App.AppCompatActivity, и да, мы будем с использованием библиотеки поддержки Android V4 и V7. Посетите этот блог, чтобы узнать поддерживающие библиотеки.

    public class MainActivity : Android.Support.V7.App.AppCompatActivity
    
  • Создайте макет для нашей MainActivity. Мы добавим FrameLayout для хранения нашего фрагмента, ViewPager и BottomNavigationView из библиотеки Android.Support.Design, как показано ниже:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:orientation="vertical"
      android:id="@+id/activity_main"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
    <FrameLayout
     android:id="@+id/fragment_content"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_above="@+id/bottom_navigation" />
    <android.support.v4.view.ViewPager
     android:id="@+id/viewpager"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_above="@id/bottom_navigation" />
    <android.support.design.widget.BottomNavigationView
     android:id="@+id/bottom_navigation"
     android:layout_width="match_parent"
     android:layout_height="56dp"
     android:layout_gravity="start"
     android:layout_alignParentBottom="true"
     android:background="@android:color/white"
     app:menu="@menu/navigation_main" />
    </RelativeLayout>
    
  • Также создайте макет для Fragment. Я буду проще со значком и меткой, вы можете оставить здесь все, что пожелаете:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
     <ImageView
     android:id="@+id/imageView"
     android:src="@drawable/abc_ic_star_black_48dp"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerInParent="true" />
     <TextView
     android:id="@+id/title"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerInParent="true"
     android:text="Fragment"
     android:textAlignment="center"
     android:textSize="@dimen/abc_text_size_display_1_material"
     android:layout_below="@id/imageView"
     android:layout_centerVertical="false" />
     </RelativeLayout>
    
  • Давайте перейдем к нижней навигации. Во-первых, нам нужны элементы навигации (вкладки) для BottomNavigationView, для этого мы добавим меню навигации.

    navigation_main.xml //Имя XML-файла

     <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
    
     <item
       android:orderInCategory="0"
       android:id="@+id/menu_genres"
       android:enabled="true"
       android:title="Genres"
       android:icon="@drawable/tab_genres"
       app:showAsAction="always" />
    
      <item
        android:orderInCategory="1"
        android:id="@+id/menu_titles"
        android:enabled="true"
        android:title="Titles"
        android:icon="@drawable/tab_titles"
        app:showAsAction="always" />
    
       <item
        android:orderInCategory="2"
        android:id="@+id/menu_stream"
        android:enabled="true"
        android:title="Stream"
        android:icon="@drawable/tab_stream"
        app:showAsAction="always" />
    
     <item
        android:orderInCategory="3"
        android:id="@+id/menu_showtimes"
        android:enabled="true"
        android:title="Showtimes"
        android:icon="@drawable/tab_showtimes"
        app:showAsAction="always" />
      </menu>
    

    Обратите внимание на orderInCategory, это порядок элементов вкладки слева направо.

    Хорошо, теперь мы собрали представления, с которыми будем работать. Теперь давайте перейдем к этому BottomNavigationView.

    В MainActivity получите BottomNavigationView и настройте его.

      bottomNavigationView= FindViewById<BottomNavigationView>(Resource.Id.bottom_navigation);
    
  • Кроме того, BottomNavigationView скрывает метки, если количество вкладок превышает 3. Итак, давайте это изменим. Добавьте этот вспомогательный метод в свой код и вызовите его при настройке BottomNavigationView следующим образом:

    RemoveShiftMode(_navigationView);//Below the FindViewById
    
    private void RemoveShiftMode(BottomNavigationView view)  // a Method in the Activity
    {   
    var menuView = (BottomNavigationMenuView) view.GetChildAt(0);
    try
    {
      var shiftingMode = menuView.Class.GetDeclaredField("mShiftingMode");
      shiftingMode.Accessible = true;
      shiftingMode.SetBoolean(menuView, false);
      shiftingMode.Accessible = false;
    
      for (int i = 0; i < menuView.ChildCount; i++)
      {
       var item = (BottomNavigationItemView)menuView.GetChildAt(i);
       item.SetShiftingMode(false);
       // set checked value, so view will be updated
       item.SetChecked(item.ItemData.IsChecked);
      }
      } catch (System.Exception ex) {
     System.Diagnostics.Debug.WriteLine((ex.InnerException??ex).Message);
     }
    }
    

    И теперь, мы должны быть в порядке. И это все. мы закончили с настройкой BottomNavigationView. Мы еще не реализовали фрагменты для каждой вкладки, поэтому нажатие на вкладки ничего не покажет. Мы представим фрагменты внутри ViewPager.

  • Теперь давайте настроим ViewPager. Во-первых, адаптер,

    public class ViewPagerAdapter : FragmentPagerAdapter
    {
       Fragment[] _fragments;
    
      public ViewPagerAdapter(FragmentManager fm, Fragment[] fragments) : base(fm)
      {
        _fragments = fragments;
      }
    
      public override int Count => _fragments.Length;
    
      public override Fragment GetItem(int position) => _fragments[position];
    }
    
  • Затем ViewPager,

    // find the view
    _viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
    
    // set the adapter
    _viewPager.Adapter = new ViewPagerAdapter(SupportFragmentManager, _fragments);
    

    и это должно быть для настройки ViewPager.

  • Когда пользователь переключается между представлениями ViewPager, запускается событие ViewPager.PageSelected. Аналогичным образом, когда пользователь нажимает на вкладку (элемент меню навигации) в BottomNavigationView, запускается событие BottomNavigationView.NavigationItemSelected. Мы должны связать эти два события, чтобы BottomNavigationView и ViewPager танцевали синхронно. Вот как мы собираемся это сделать.

    Объявите обработчик событий для BottomNavigationView и ViewPager следующим образом:

     // wireup the page selection event
     _viewPager.PageSelected += ViewPager_PageSelected; 
    
    // wire up the selection event 
     _navigationView.NavigationItemSelected += NavigationView_NavigationItemSelected;
    
  • При выборе страницы ViewPager мы уведомляем BottomNavigationView и наоборот. Как это,

       private 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);
        }
    
  • И это все. Теперь BottomNavigationView и ViewPager отображают выбранный фрагмент/страницу/вкладку и обновляют друг друга с плавным переходом.

И последнее, загрузите фрагменты для этих вкладок.

      void InitializeTabs()
 {
     _fragments = new Fragment[] {
     TheFragment.NewInstance("Genres", "tab_genres"),
     TheFragment.NewInstance("Titles", "tab_titles"),
     TheFragment.NewInstance("Stream", "tab_stream"),
     TheFragment.NewInstance("Showtimes", "tab_showtimes")
     };
 }
person FreakyAli    schedule 29.01.2019

Нижняя панель добавляется к первому действию. Если вы измените действие, при выборе нижняя панель исчезнет.

Вам нужно добавить просмотр пейджера с фрагментом, чтобы достичь этого.

Вы можете ознакомиться с этим руководством

Вы также можете увидеть этот код пример

person Pooja Kamath    schedule 29.01.2019
comment
Спасибо, эти уроки полезны :) - person Gurmeet; 29.01.2019