我正在与Xamarin一起使用Android。我有一个显示WebView的片段和一个显示带有2个选项卡的PageViewer的页面。一切工作正常,直到我激活我的Android设备上的开发人员选项“不要保持活动”。当我开始我的应用程序,我走在家里,一切都好,所以我去WebViewPage,我发送应用程序到后台,我恢复它,WebViewPage显示正确,但当我去家里(我使用导航抽屉),标签正确地重新创建,但碎片是空白的。我真的不明白为什么..看起来OnCreateView没有被调用,并且我的适配器的GetItem()在重新创建的Activity之后未被调用。调试我看到:这两个片段被系统调用为第一个,但由于某种原因,当我重新创建我的选项卡时,片段是空白的。Android,PageView在重新创建活动后无法显示片段
这是我的代码:
MainActivity
namespace N****_AndroidOS {
[ Activity (Label = "Niteko", /*LaunchMode = Android.Content.PM.LaunchMode.SingleInstance,*/ ScreenOrientation = ScreenOrientation.Portrait, Icon = "@drawable/icon") ]
public class MainActivity : AppCompatActivity {
private NavigationView m_nvNavigationView;
private DrawerLayout m_dlDrawerLayout;
private Toolbar m_tToolBar;
/* Fragments */
private CatalogShowerTabsFragment m_fCatalogWithTabShower;
private WebViewPageFragment m_fHowWeAre;
private WebViewPageFragment m_fTermsAndConds;
private WebViewPageFragment m_fInfoPrivacy;
private SettingsFragment m_fSettings;
private ContactUsFragment m_fContactUs;
private NotificationFragment m_fNotifications;
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
SetContentView(Resource.Layout.activity_nav_drawer);
SetupToolBar();
m_dlDrawerLayout = (DrawerLayout)FindViewById(Resource.Id.nav_drawer);
m_nvNavigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
SupportActionBar.SetHomeAsUpIndicator(Resource.Drawable.ic_menu);
SupportActionBar.SetDisplayHomeAsUpEnabled(true);
SupportActionBar.SetDisplayUseLogoEnabled(true);
SupportActionBar.SetLogo(Resource.Drawable.ic_icon_header);
SupportActionBar.SetWindowTitle(Resources.GetString(Resource.String.title_home));
m_nvNavigationView.NavigationItemSelected += (sender, e) => {
e.MenuItem.SetChecked(true);
//react to click here and swap fragments or navigate
ChangeFragment(e.MenuItem.ItemId);
m_dlDrawerLayout.CloseDrawers();
};
m_nvNavigationView.Menu.GetItem(0).SetChecked(true);
m_fCatalogWithTabShower = null;
m_fHowWeAre = null;
m_fTermsAndConds = null;
m_fInfoPrivacy = null;
m_fSettings = null;
m_fContactUs = null;
m_fNotifications = null;
if (bundle == null) {
ChangeFragment(Resource.Id.nav_home);
}
else {
}
}
private void ChangeFragment(int iMenuID, object iArg = null) {
RunOnUiThread(() => {
// Create a new fragment and a transaction.
Android.Support.V4.App.FragmentTransaction fragmentTx = (Android.Support.V4.App.FragmentTransaction) this.SupportFragmentManager.BeginTransaction();
Android.Support.V4.App.Fragment fragmentToShow = null;
bool isLogged = false;
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this);
string eMail = prefs.GetString(ParamsInfo.PK_EMAIL, "");
if (string.IsNullOrEmpty(eMail)) {
isLogged = false;
}
else {
isLogged = true;
}
switch (iMenuID) {
case Resource.Id.nav_home:
SupportActionBar.SetDisplayUseLogoEnabled(true);
SupportActionBar.SetLogo(Resource.Drawable.Icon);
SupportActionBar.SetWindowTitle(Resources.GetString(Resource.String.title_home));
if (m_fCatalogWithTabShower == null) {
m_fCatalogWithTabShower = new CatalogShowerTabsFragment();
}
fragmentToShow = m_fCatalogWithTabShower;
break;
case Resource.Id.nav_howweare:
SupportActionBar.SetDisplayUseLogoEnabled(false);
SupportActionBar.SetWindowTitle(Resources.GetString(Resource.String.title_who));
if (m_fHowWeAre == null) {
m_fHowWeAre = new WebViewPageFragment();
m_fHowWeAre.WebPageID = ParamsInfo.PK_STATIC_HOWWEARE;
}
//fragmentTx.AddToBackStack(null);
fragmentToShow = m_fHowWeAre;
break;
}
if (fragmentToShow != null) {
// Replace the fragment that is in the View fragment_container (if applicable).
fragmentTx.Replace(Resource.Id.nav_contentframe, fragmentToShow);
// Add the transaction to the back stack.
//fragmentTx.AddToBackStack(null);
// Commit the transaction.
fragmentTx.Commit();
}
});
}
}
CatalogShowerFragment被称为与两个片段
public class CatalogShowerTabsFragment : Android.Support.V4.App.Fragment {
private View m_vView;
private Adapter m_aViewPagerAdapter;
private bool m_bAlreadyFilled = false;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Use this to return your custom view for this Fragment
// return inflater.Inflate(Resource.Layout.YourFragment, container, false);
if (!m_bAlreadyFilled) {
m_vView = inflater.Inflate(Resource.Layout.CatalogWithTabShowerLayout, container, false);
var viewPager = m_vView.FindViewById<Android.Support.V4.View.ViewPager>(Resource.Id.htab_viewpager);
if (viewPager != null) {
setupViewPager(viewPager);
}
TabLayout tabLayout = m_vView.FindViewById<TabLayout>(Resource.Id.htab_tabs);
tabLayout.SetupWithViewPager(viewPager);
m_bAlreadyFilled = true;
}
return m_vView;
}
public override void OnDestroy() {
base.OnDestroy();
AndroidHUD.AndHUD.Shared.Dismiss(Activity);
}
class Adapter : Android.Support.V4.App.FragmentPagerAdapter {
List<V4Fragment> fragments = new List<V4Fragment>();
List<string> fragmentTitles = new List<string>();
public Adapter(V4FragmentManager fm) : base (fm) {
}
public void AddFragment(V4Fragment fragment, string title) {
fragments.Add(fragment);
fragmentTitles.Add(title);
}
public override V4Fragment GetItem(int position) {
return fragments[ position ];
}
public override int Count {
get { return fragments.Count; }
}
public override Java.Lang.ICharSequence GetPageTitleFormatted(int position) {
return new Java.Lang.String(fragmentTitles[ position ]);
}
}
/* Costruiamo la Tabbar per la selezione dei tipi di prodotti */
private void setupViewPager(Android.Support.V4.View.ViewPager viewPager) {
if (m_aViewPagerAdapter == null) {
m_aViewPagerAdapter = new Adapter(Activity.SupportFragmentManager);
ItemsListCategoryFragment fragmentProduct = new ItemsListCategoryFragment();
fragmentProduct.ListType = ItemsListCategoryFragment.LIST_CATEGORY.LC_PRODUCTS;
ItemsListCategoryFragment fragmentApplications = new ItemsListCategoryFragment();
fragmentApplications.ListType = ItemsListCategoryFragment.LIST_CATEGORY.LC_APPLICATIONS;
m_aViewPagerAdapter.AddFragment(fragmentProduct, Resources.GetString(Resource.String.tab_productions_title));
m_aViewPagerAdapter.AddFragment(fragmentApplications, Resources.GetString(Resource.String.tab_applications_title));
viewPager.Adapter = m_aViewPagerAdapter;
viewPager.Adapter.NotifyDataSetChanged();
}
}
}
然后最后的片段创建pageviewer。
public enum LIST_CATEGORY {
LC_PRODUCTS
, LC_APPLICATIONS
}
private LIST_CATEGORY m_enListType;
private CategoryListResponseResult m_clrResponseResult;
private ItemsListCategoryShowerAdapter m_ilcCatergoryAdapter;
private List<CategoryModel> m_lCategoryModelList;
private Task m_tTask;
private View m_vView;
//Pull to refresh
private PullToRefresharp.Android.Widget.ListView m_lListView;
/* params */
private int m_iCurrentPage = 0;
private int m_iPageLimit = 10;
private bool m_bFirstTime = true;
private bool m_bNoMoreElem = false;
public static bool pezza = false;
public LIST_CATEGORY ListType {
set { m_enListType = value; }
get { return m_enListType; }
}
public ItemsListCategoryFragment(/*LIST_CATEGORY iListType*/) {
m_enListType = LIST_CATEGORY.LC_APPLICATIONS; //iListType;
m_tTask = Task.Factory.StartNew(() => {});
}
public override void OnActivityCreated(Bundle savedInstanceState) {
base.OnActivityCreated(savedInstanceState);
}
public override void OnCreate(Bundle savedInstanceState) {
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
pezza = true;
if (savedInstanceState != null) {
m_enListType = (LIST_CATEGORY)(savedInstanceState.GetInt(ParamsInfo.PK_CATTYPE));
}
if (m_vView == null) {
m_vView = inflater.Inflate(Resource.Layout.CatalogGeneralListLayout, container, false);
m_lListView = m_vView.FindViewById<PullToRefresharp.Android.Widget.ListView>(Resource.Id.lwMyEventsPullToRefresh);
m_lListView.RefreshActivated += RefreshMyContent;
m_lListView.ItemClick += OnListItemClick;
m_lListView.ScrollStateChanged += (sender, e) => {
OnScrollStateChange(e.ScrollState);
};
GetAndFillListFromNetwork();
}
return m_vView;
}
public override void OnResume() {
base.OnResume();
}
private void RefreshMyContent(object sender, EventArgs e) {
Activity.RunOnUiThread(() => {
m_iCurrentPage = 0;
m_bNoMoreElem = false;
m_bFirstTime = true;
GetAndFillListFromNetwork();
m_lListView.OnRefreshCompleted();
});
}
public override void OnDestroy() {
base.OnDestroy();
AndroidHUD.AndHUD.Shared.Dismiss(Activity);
}
private void GetAndFillListFromNetwork() {
//AndHUD.Shared.Show(Activity, Resources.GetString(Resource.String.loading));
AndHUD.Shared.ShowToast(Activity, Resources.GetString(Resource.String.loading), (MaskType)3, default(TimeSpan?), false);
m_tTask = m_tTask.ContinueWith(t => {
InformationData infoData = new InformationData();
if (m_enListType == LIST_CATEGORY.LC_PRODUCTS) {
infoData.AddParam(ParamsInfo.PK_CATTYPE, "0"); //0: prodotti 1: applicazioni
}
else {
infoData.AddParam(ParamsInfo.PK_CATTYPE, "1");
}
infoData.AddParam(ParamsInfo.PK_PAGENUM, m_iCurrentPage.ToString());
infoData.AddParam(ParamsInfo.PK_PAGELIMIT, "10");
m_clrResponseResult = (CategoryListResponseResult)FrontController.Instance.Execute(CommandType.COMMANDREQUEST.CR_ASYNC_GETCATEGORY, infoData);
Activity.RunOnUiThread(() => {
AndHUD.Shared.Dismiss(Activity);
switch (m_clrResponseResult.Status) {
case ResponseResult.RESPONDSTATUS.RS_SUCCESS:
if (m_bFirstTime) {
m_bFirstTime = false;
m_lCategoryModelList = new List<CategoryModel>();
m_lCategoryModelList.AddRange(m_clrResponseResult.data.categories);
m_ilcCatergoryAdapter = new ItemsListCategoryShowerAdapter(Activity, m_lCategoryModelList);
m_lListView.Adapter = m_ilcCatergoryAdapter;
}
else {
m_lCategoryModelList.AddRange(m_clrResponseResult.data.categories);
}
if (m_clrResponseResult.data.categories.Count < m_iPageLimit) {
m_bNoMoreElem = true;
}
m_ilcCatergoryAdapter.NotifyDataSetChanged();
break;
case ResponseResult.RESPONDSTATUS.RS_CONNECTION_ERROR:
PerformConnectionLost();
break;
}
});
});
}
public override void OnSaveInstanceState(Bundle outState) {
outState.PutInt(ParamsInfo.PK_CATTYPE, (int)m_enListType);
base.OnSaveInstanceState(outState);
}
private void PerformConnectionLost() {
AndHUD.Shared.ShowError(Activity, Resources.GetString(Resource.String.err_connection_lost), MaskType.None, new TimeSpan(90, 90, 90, 90), OnOkMessageClick);
}
private void OnOkMessageClick() {
GetAndFillListFromNetwork();
}
private void OnListItemClick(object iSender, AdapterView.ItemClickEventArgs iEvent) {
CategoryModel cm = m_lCategoryModelList[ iEvent.Position ];
Intent itemsDetailsActivity = new Intent(Activity, typeof(ItemsListDetailsActivity));
itemsDetailsActivity.PutExtra(ParamsInfo.PK_CAT_ID, cm.id);
itemsDetailsActivity.PutExtra(ParamsInfo.PK_CAT_TITLE, cm.label);
itemsDetailsActivity.PutExtra(ParamsInfo.PK_IMG_URL, cm.img);
if (m_enListType == LIST_CATEGORY.LC_APPLICATIONS) {
itemsDetailsActivity.PutExtra(ParamsInfo.PK_HEADER_TITLE, Resources.GetString(Resource.String.title_applications));
}
else {
itemsDetailsActivity.PutExtra(ParamsInfo.PK_HEADER_TITLE, Resources.GetString(Resource.String.title_products));
}
StartActivity(itemsDetailsActivity);
}
protected void OnScrollStateChange(ScrollState iScrollState) {
if (iScrollState == ScrollState.Idle) {
if (m_lListView.LastVisiblePosition == m_lListView.Adapter.Count - 1) {
/* richiamo i prossimi elementi */
if (!m_bNoMoreElem) {
++m_iCurrentPage;
GetAndFillListFromNetwork();
}
}
}
}
}
我实在无法理解为什么这么想的工作时,我重新创建我的活动..它似乎片段已经被系统默认创建的,但我用我自己用强制recostruction新的浏览器,为什么片段不显示?在重构应用程序后,其他部分中的每个其他片段都会毫无问题地显示。
谢谢你。