我正在與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新的瀏覽器,爲什麼片段不顯示?在重構應用程序後,其他部分中的每個其他片段都會毫無問題地顯示。
謝謝你。