我可以在Fragment中成功使用ViewPager,但我似乎无法在DialogFragment中使用它。我的目标是使用带有ViewPager的模态DialogFragment,允许用户在自定义片段之间滑动。我收到以下错误。
找不到ID为0x7f0d003a(eI.TeacherApp.Droid:id / teachingClass_favorites_viewSwitcher_pager)的片段,用于片段FavoritesPageFragment {418bc9b0#2 id = 0x7f0d003a}
我从其他帖子中了解到,在原生android中使用ChildFragmentManager解决了这个问题。问题是Xamarin没有ChildFragmentManager。我的DialogFragment代码如下。设置ViewPager适配器时,ShowFavorites中会出现错误。
public class FavoritesDialogFragment : PFDialogFragmentBase, IFavoritesView
{
private Android.Support.V4.View.ViewPager viewPagerResults = null;
private SimpleViewPagerListFragmentAdapter pagerAdapterResults = null;
private FavoritesPresenter presenter;
private DeviceMessenger deviceMessenger = null;
#region DialogFragment life cycle overrides.
//This gets called when the back button is used or the user clicks outside the dialog.
public override void OnCancel(IDialogInterface dialog)
{
base.OnCancel(dialog);
}
public override void OnResume()
{
base.OnResume();
presenter = new FavoritesPresenter(this, deviceMessenger);
presenter.Activate();
presenter.GetFavorites(true);
}
public override void OnPause()
{
base.OnPause();
if (presenter != null)
{
presenter.View = null;
presenter.Deactivate();
}
}
#endregion
public FavoritesDialogFragment()
{
deviceMessenger = ApplicationContainer.Instance.ResolveConcrete<DeviceMessengerManager>().DeviceMessenger;
}
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your fragment here
}
public static FavoritesDialogFragment CreateNewDialogFragmentInstance()
{
FavoritesDialogFragment frag = new FavoritesDialogFragment();
Bundle args = CreateBundle("", "");
frag.Arguments = args;
return frag;
}
protected override AlertDialog CreateAlertDialog(string title, string message)
{
View view = Activity.LayoutInflater.Inflate(Resource.Layout.teaching_class_favorites_pager, null);
viewPagerResults = view.FindViewById<Android.Support.V4.View.ViewPager>(Resource.Id.teachingClass_favorites_viewSwitcher_pager);
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(Activity, AlertDialog.ThemeHoloLight))
.SetView(view);
AlertDialog dialog = builder.Create();
return dialog;
}
#region IFavoritesView implementation
public void LogMessage(string message)
{
Log.Debug("FavoritesDialogFragment", message);
}
public void ShowFavorites(List<eInstruction.Device.DeviceMessages.FavoritesDeviceMessage.Favorite> favoritesToShow, int currentPage, int totalPages)
{
// First separate the favorites into pages
Dictionary<string, List<FavoritesDeviceMessage.Favorite>> pages = new Dictionary<string, List<FavoritesDeviceMessage.Favorite>>();
foreach (FavoritesDeviceMessage.Favorite favorite in favoritesToShow)
{
if (!pages.ContainsKey(favorite.PageTitle))
{
pages.Add(favorite.PageTitle, new List<FavoritesDeviceMessage.Favorite>());
}
pages[favorite.PageTitle].Add(favorite);
}
List<Fragment> pageFragments = new List<Fragment>();
if(pages.Count > 0)
{
foreach (string key in pages.Keys)
{
IList<FavoriteDataItem> items = new List<FavoriteDataItem>();
foreach (FavoritesDeviceMessage.Favorite favorite in pages[key])
{
items.Add(new FavoriteDataItem {FavoriteID = favorite.Id, Title = favorite.Label, ImageName = ""/*favoritesIcons[favorite.Icon]*/, SequenceOrder = favorite.SequenceOrder });
}
pageFragments.Add(new FavoritesPageFragment(key, items.ToList()));
}
}
else
{
pageFragments.Add(new FavoritesPageFragment("No Favorites Assigned", new List<FavoriteDataItem>()));
}
Activity.RunOnUiThread(() => {
pagerAdapterResults = new SimpleViewPagerListFragmentAdapter(FragmentManager, pageFragments.ToList());
viewPagerResults.Adapter = pagerAdapterResults;
});
}
public void HideFavorites()
{
Log.Debug("FavoritesDialogFragment", "HideFavorites called.");
}
public bool RequestIndividualPages {
get {
return true;
}
}
#endregion
#region implemented abstract members of PFDialogFragmentBase
public override bool DoButtonClick(int buttonIndex)
{
return true;
}
#endregion
}