2016-04-26 14 views
0

私はタブでスクロールした後、REST APIサービスでコードを編集するとテキストに問題があります。Xamarin Androidのトラフタブをスクロールした後、コード別にテキストが消えます

I'VE MADE A VIDEO OF MY PROBLEM

私は私のArtikelDetailActivityTablayout(android.support.design.widget.TabLayout)とViewpager(android.support.v4.view.ViewPager)を設定しました。私の断片で

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

私はデータiがGetArtikelVoorraad()に設定したWICH活動をロードアップ見せています。

次のタブにスクロールして最初のタブに戻ると、テキストビューにデータが正しく表示されます。

しかし、2つのタブをスクロールして最初のタブに戻ると、コードで設定されたテキストビューが消えてしまいます。レイアウトに設定されている静的テキストが表示されます。最初のタブの3番目のタブから最初のタブに直接移動すると、同じ問題が発生します。

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

あなたはこの問題で私を助けることができますか?

答えて

0

Fragmentが画面の外にあるときにあなたのデータが破壊されていると思います。それが再び現れたときに再現されました。

Fragmentのローカル変数にデータを保存してみてください。またはOnCreateView

内のデータを取得することはFragmentLifecycleを見てみましょう:

Fragments lifecycle

出典:情報についてhttp://developer.android.com/guide/components/fragments.html#Lifecycle

+0

感謝を。 OnResume()関数でコードを変更すると、現在動作しています。 OnCreateView()はあまりにも早すぎます。なぜなら私が第3のタブに切り替えて戻ってくると、OnCreateView()に移動しないからです。 2回以上スクロールすると、フラグメントが一時停止するように見えます。 – JeffreyM

+0

あなたの質問に加えて、「アクティビティ」のデータを設定できるので、誰かが2タブ以上を変更するたびにインターネットに接続する必要はありません。 – Pilatus

関連する問題