使用Xamarin在DialogFragment中使用ViewPager失败

时间:2014-04-16 18:30:23

标签: android android-viewpager xamarin.android xamarin android-dialogfragment

我可以在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
}

0 个答案:

没有答案