То же представление появляется при выборе пункта меню из вида навигации после скольжения по табуляции в родном xamarin android - PullRequest
0 голосов
/ 18 октября 2018

Я работаю только с Xamarin android (нативным) в первый раз (около недели), и я беру код отсюда и там, чтобы посмотреть, как он работает, но я застрял на данный момент.

У меня есть представление навигации с табулированием.Фрагменты навигационного представления управляются с помощью SupportFragmentManager, который позже я передаю в пейджер, чтобы добавить некоторые другие фрагменты в мою вкладку.

Моя проблема возникает, когда я второй раз выбираю пункт меню на панели навигации.Если я, например, переключаюсь с MenuItem_1 на MenuItem_2, макет MenuItem_2 такой же, какой я только что видел в Menu_Item1, но меняются названия вкладок, а также меняются заголовок и цвет панели инструментов, моя единственная проблема заключается в том, что после выбора одного MenuItem остальныебудет отображать тот же контент, что и первый.

Вот мой код MainActivity:

using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Graphics;
using MyApp.Fragments;
using Android.Support.Design.Widget;
using Android.Support.V4.Widget;
using Android.Support.V4.View;
using Android.Support.V7.App;
using Android.Content;
using TabIt
using MyApp.Fragments.Tabs;
using Android.Support.V4.App;

namespace MyApp
{
    //[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait, Label = "@string/app_name", MainLauncher = true, LaunchMode = Android.Content.PM.LaunchMode.SingleTop)]
    [Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait, MainLauncher = false, LaunchMode = Android.Content.PM.LaunchMode.SingleTop, Icon ="@drawable/icon")]
    public class MainActivity : AppCompatActivity, View.IOnClickListener
    {
        int oldPosition = -1;
        DrawerLayout drawerLayout;
        NavigationView navigationView;
        IMenuItem previousItem;        
        ImageView navMenuImg;
        TabLayout tabLayout;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.drawer_layout);

            var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);

            tabLayout = FindViewById<TabLayout>(Resource.Id.sliding_tabs);

            if (toolbar != null)
            {
                SetSupportActionBar(toolbar);

                 SupportActionBar.SetDisplayHomeAsUpEnabled(true);
                 SupportActionBar.SetHomeButtonEnabled(true);
            }

            drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);
            SupportActionBar.SetHomeAsUpIndicator(Resource.Drawable.ic_menu_black);
            navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);            
            navMenuImg = FindViewById<ImageView>(Resource.Id.nav_image);

            navigationView.NavigationItemSelected += (sender, e) =>
            {
                if (previousItem != null)
                    previousItem.SetChecked(false);

                navigationView.SetCheckedItem(e.MenuItem.ItemId);

                previousItem = e.MenuItem;

                if (toolbar != null)
                {
                    SupportActionBar.SetDisplayHomeAsUpEnabled(true);
                    SupportActionBar.SetHomeButtonEnabled(true);                    
                }
                switch (e.MenuItem.ItemId)
                {
                    case Resource.Id.nav_home:                        
                        ListItemClicked(0);

                        break;
                    case Resource.Id.nav_item1:
                        ListItemClicked(0);
                        toolbar.Title = "MenuItem1";
                        break;
                    case Resource.Id.nav_item2:
                        ListItemClicked(1);
                        toolbar.Title = "MenuItem2";
                        break;                   
                    case Resource.Id.nav_loginItem:
                        if (toolbar != null)
                        {
                            SupportActionBar.SetDisplayHomeAsUpEnabled(false);
                            SupportActionBar.SetHomeButtonEnabled(false);
                        }
                        ListItemClicked(2);
                        break;
                }

                drawerLayout.CloseDrawers();
            };

            if (savedInstanceState == null)
            {
                navigationView.SetCheckedItem(Resource.Id.nav_MenuItem1);
                ListItemClicked(0);
            }
        }

        private void ListItemClicked(int position)
        {            
            if (position == oldPosition)
                return;

            oldPosition = position;

            Android.Support.V4.App.Fragment fragment = null;
            Android.Support.V4.App.Fragment[] fragArray = null;
            string[] titles = null;
            switch (position)
            {
                case 0:
                    fragment = Fragment1.NewInstance();  
                    break;
                    fragArray = new Android.Support.V4.App.Fragment[]
                    {
                        new TabFragment1(),
                        new TabFragment2(),
                        new TabFragment3()
                    };

                    titles = new string[]{"Item1Tab1","Item1Tab2","Item1Tab3" };

                    FnInitTabLayout(fragArray, titles);

                case 1:
                    fragment = Fragment2.NewInstance();
                    fragArray = new Android.Support.V4.App.Fragment[]
                    {
                        new TabFragment1(),
                        new TabFragment2(),
                        new TabFragment3()
                    };

                    titles = new string[]{"Item2Tab1","Item2Tab2" };

                    FnInitTabLayout(fragArray, titles);
                    break;


               case 2:
                    fragment = LoginFragment.NewInstance();
                    break;
            }

            SupportFragmentManager.BeginTransaction()
                .Replace(Resource.Id.content_frame, fragment)
                .Commit();
        }



        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            switch (item.ItemId)
            {
                case Android.Resource.Id.MenuItem1:
                    drawerLayout.OpenDrawer(GravityCompat.Start);
                    return true;
            }
            return base.OnOptionsItemSelected(item);
        }

        void FnInitTabLayout(Android.Support.V4.App.Fragment[] tabs, string[] fragTitles)
        {
            tabLayout.SetTabTextColors(Android.Graphics.Color.Blue, Android.Graphics.Color.White);

            var fragments = tabs;
            var titles = CharSequence.ArrayFromStringArray(fragTitles);
            var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);

            viewPager.Adapter = new TabsFragmentPagerAdapter(SupportFragmentManager, fragments, titles);

            tabLayout.SetupWithViewPager(viewPager);         

        }            
    }
}

Мой main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/drawer_layout"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <!--android:fitsSystemWindows="true"-->

<!-- The main content view -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <include
                android:id="@+id/toolbar"
                layout="@layout/toolbar"
                android:layout_alignParentTop="true"/>

            <FrameLayout
                android:id="@+id/content_frame"
                android:layout_below="@id/toolbar_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <android.support.design.widget.TabLayout
                android:id="@+id/sliding_tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#000000"
                app:tabMode="fixed"
                app:tabGravity="fill" />

            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="match_parent"
                android:layout_height="0px"
                android:layout_weight="1"
                android:background="#ffffff" />
        </android.support.design.widget.AppBarLayout>        

    </RelativeLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/nav_menu"
        android:fitsSystemWindows="true" />
</android.support.v4.widget.DrawerLayout>

И мой адаптер VievPager

using System;
using Android.Support.V4.App;
using Java.Lang;

namespace TabIt
{
    public class TabsFragmentPagerAdapter : FragmentPagerAdapter
    {
        private readonly Fragment[] fragments;

        private readonly ICharSequence[] titles;

        public TabsFragmentPagerAdapter(FragmentManager fm, Fragment[] fragments, ICharSequence[] titles) : base(fm)
        {
            this.fragments = fragments;
            this.titles = titles;
        }
        public override int Count
        {
            get
            {
                return fragments.Length;
            }
        }

        public override Fragment GetItem(int position)
        {
            return fragments[position];
        }

        public override ICharSequence GetPageTitleFormatted(int position)
        {
            return titles[position];
        }
    }
}

Я пытался использовать .Dispose () почти во всех ресурсах, которые я вызывал в своей основной деятельности.Я также сделал быстрый просмотр tabLayout, чтобы увидеть, сколько у него вкладок и количество верных.Проблема только в визуализации.Как я уже упоминал, когда я выбираю MenuItem из меню навигации, не имеет значения, если я перехожу на другой MenuItem, я вижу то же самое содержимое.

Может ли кто-нибудь указать мне правильное направление?или хотя бы посмотрите, если что-то не имеет смысла?

Спасибо, как всегда, заранее.

...