Search code examples
androidxamarintextviewfragment

Text by code dissapear after scrolling trough tabs in Xamarin Android


I'm having some troubles with text, which I edit by code with a REST API service, is disappearing after I scroll trough the tabs.

I'VE MADE A VIDEO OF MY PROBLEM

I've set up Tablayout (android.support.design.widget.TabLayout) and a Viewpager (android.support.v4.view.ViewPager) on my ArtikelDetailActivity.

ArtikelDetailActivity.cs

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Support.Design.Widget;
using Android.Support.V4.View;
using Fragment = Android.Support.V4.App.Fragment;
using Android.Support.V7.App;

namespace MES
{
    [Activity(Label = "Artikelen detail")]
    public class ArtikelDetailActivity : AppCompatActivity
    {
        public static string sArtikelnr;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.ArtikelDetail_layout);

            Android.Support.V7.Widget.Toolbar myToolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.my_toolbar);
            myToolbar.Title = getArtikelnr();
            SetSupportActionBar(myToolbar);

            var fragments = new Fragment[]
            {
                new VoorraadFragment(),
                new MagazijnFragment(),
                new GeplandFragment(),
                new MutatieFragment(),
                new ProductieorderFragment()
            };

            var titles = CharSequence.ArrayFromStringArray(new[]
            {
                "Voorraad",
                "Magazijn",
                "Gepland",
                "Mutatie",
                "Productieorder"
            });

            var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
            viewPager.Adapter = new TabsFragmentPagerAdapter(SupportFragmentManager, fragments, titles);

            // Give the TabLayout the ViewPager
            var tabLayout = FindViewById<TabLayout>(Resource.Id.sliding_tabs);
            tabLayout.SetupWithViewPager(viewPager);
        }

        public string getArtikelnr()
        {
            return Intent.GetStringExtra("artikelnr");
        }
    }
}

In my Fragment VoorraadFragment.cs I fill up Textviews with the result of my REST API service.

VoorraadFragment.cs

using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Android.Support.V4.App;
using MES.Models;
using Newtonsoft.Json;
using System.Threading.Tasks;

namespace MES
{
    public class VoorraadFragment : Fragment
    {
        public override async void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            ArtikelDetailActivity act = (ArtikelDetailActivity)this.Activity;
            await GetArtikelVoorraad(act.getArtikelnr());
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            return inflater.Inflate(Resource.Layout.VoorraadFragment_layout, container, false);
        }

        async Task GetArtikelVoorraad(string sArtikelnr)
        {
            var api = new Api(this.Activity);
            var artikelVoorraad = await api.GetArtikelVoorraad(sArtikelnr);

            ArtikelVoorraad artikelVrd = JsonConvert.DeserializeObject<ArtikelVoorraad>(artikelVoorraad.ToString());

            TextView aanwezigAlleMagazijnen = View.FindViewById<TextView>(Resource.Id.aanwezigAlleMagazijnenLabel);
            TextView inNotaAlleMagazijnen = View.FindViewById<TextView>(Resource.Id.inNotaAlleMagazijnenLabel);
            TextView gereserveerdAlleMagazijnen = View.FindViewById<TextView>(Resource.Id.gereserveerdAlleMagazijnenLabel);

            TextView subHeaderVoorraadDefaultMagazijn = View.FindViewById<TextView>(Resource.Id.subHeaderVoorraadDefaultMagazijn);
            TextView aanwezigDefaultMagazijn = View.FindViewById<TextView>(Resource.Id.aanwezigDefaultMagazijnLabel);
            TextView inNotaDefaultMagazijn = View.FindViewById<TextView>(Resource.Id.inNotaDefaultMagazijnLabel);
            TextView gereserveerdDefaultMagazijn = View.FindViewById<TextView>(Resource.Id.gereserveerdDefaultMagazijnLabel);

            aanwezigAlleMagazijnen.Text = artikelVrd.VoorraadStock.ToString();
            inNotaAlleMagazijnen.Text = artikelVrd.VoorraadGereserveerd.ToString();
            gereserveerdAlleMagazijnen.Text = artikelVrd.VoorraadGereserveerd.ToString();

            subHeaderVoorraadDefaultMagazijn.Text = "Voorraad voor default magazijn " + artikelVrd.DefaultMagazijn.ToString();
            aanwezigDefaultMagazijn.Text = artikelVrd.VoorraadStockDefaultMagazijn.ToString();
            inNotaDefaultMagazijn.Text = artikelVrd.VoorraadInNotaDefaultMagazijn.ToString();
            gereserveerdDefaultMagazijn.Text = artikelVrd.VoorraadGereserveerdDefaultMagazijn.ToString();
        }
    }
}

When I load the activity the data which I've set in GetArtikelVoorraad() is showing up.

If I scroll to the next tab and go back to the first tab, the textviews are showing the data correctly.

But if I scroll 2 tabs and go back to the first tab the textviews which were set by code are disappearing. The static text which have been set in the layout is showing up. I'm having the same problems if I directly go from first tab third tab and back to the first tab.

TabsFragmentPagerAdapter.cs

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

namespace MES
{
    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];
        }
    }
}

Can you help me with this problem?


Solution

  • I think that your data is being destroyed when the Fragment is out of bounds of the screen. And recreated when it shows up again.

    Try saving your data to a local variable within the Fragment. Or get the data within OnCreateView

    Take a look at the Lifecycle of a Fragment:

    Fragments lifecycle

    Source: http://developer.android.com/guide/components/fragments.html#Lifecycle