在 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
内的数据
看看 Fragment
的 Lifecycle
:
来源:http://developer.android.com/guide/components/fragments.html#Lifecycle
我在使用 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
看看 Fragment
的 Lifecycle
:
来源:http://developer.android.com/guide/components/fragments.html#Lifecycle