在Xamarin Android

时间:2016-04-26 08:22:43

标签: android xamarin textview fragment

我在使用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");
        }
    }
}

在我的片段 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();
        }
    }
}

当我加载活动时,我在 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];
        }
    }
}

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

1 个答案:

答案 0 :(得分:0)

我认为当Fragment超出屏幕范围时,您的数据将被销毁。当它再次出现时重新创建。

尝试将数据保存到Fragment中的本地变量。或者在OnCreateView

中获取数据

查看Lifecycle的{​​{1}}:

Fragments lifecycle

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