在 Xamarin Android 中滚动选项卡后,代码文本消失

Text by code dissapear after scrolling trough tabs in Xamarin Android

我在使用 REST API 服务通过代码编辑的文本方面遇到了一些问题,在滚动选项卡后这些文本消失了。

I'VE MADE A VIDEO OF MY PROBLEM

我设置了 Tablayout (android.support.design.widget.TabLayout) 和 Viewpager (android.support.v4.view.ViewPager) 在我的 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");
        }
    }
}

在我的 Fragment VoorraadFragment.cs 中,我用我的 REST API 服务的结果填充了 Textviews。

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();
        }
    }
}

当我加载 activity 时,我在 GetArtikelVoorraad() 中设置的数据显示出来。

如果我滚动到下一个选项卡并返回到第一个选项卡,文本视图会正确显示数据。

但是如果我滚动 2 个选项卡并返回到第一个选项卡,代码设置的文本视图就会消失。在布局中设置的静态文本正在显示。如果我直接从第一个选项卡第三个选项卡返回到第一个选项卡,我会遇到同样的问题。

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];
        }
    }
}

你能帮我解决这个问题吗?

我认为当 Fragment 超出屏幕范围时,您的数据正在被破坏。并在它再次出现时重新创建。

尝试将您的数据保存到 Fragment 中的局部变量。或者获取OnCreateView

内的数据

看看 FragmentLifecycle:

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