找不到碎片类.膨胀

本文关键字:膨胀 碎片 找不到 | 更新日期: 2023-09-27 18:09:57

我正在使用这个教程http://blog.ostebaronen.dk/2013/07/fragments-and-viewpager-with-mvx.html在我的android应用程序中使用ViewPager实现一个选项卡视图。

在做了所有告诉的事情之后,当android试图膨胀片段

时抛出一个异常。

无法实例化片段moviehall.client.android.views.fragments.AllMoviesView:请确保类名存在,是公共的,并且有一个空的公共构造函数

经过一番研究,我发现的所有地方都暗示问题出在java没有检测到大写的名称空间,但是正如您在错误中看到的那样,它是正确的。我错过了什么?

下面是我用来扩展片段的代码:

public override Fragment GetItem(int position)
{
    var frag = Fragments.ElementAt(position);
    var fragment = Fragment.Instantiate(_context,
        FragmentJavaName(frag.FragmentType));
    ((MvxFragment)fragment).DataContext = frag.ViewModel;
    return fragment;
}

这是FragmentInfo类

public class FragmentInfo
{
    public string Title { get; set; }
    public Type FragmentType { get; set; }
    public IMvxViewModel ViewModel { get; set; }
}

这是我用来将命名空间转换为小写

的方法
protected virtual string FragmentJavaName(Type fragmentType)
{
    var namespaceText = fragmentType.Namespace ?? "";
    if (namespaceText.Length > 0)
        namespaceText = namespaceText.ToLowerInvariant() + ".";
    return namespaceText + fragmentType.Name;
}

最后,这个类找不到

namespace MovieHall.Client.Android.Views.Fragments
{    
    [Activity(Label = "Movies")]
    public class AllMoviesView : MvxFragment
    {
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var ignore =  base.OnCreateView(inflater, container, savedInstanceState);
            return this.BindingInflate(Resource.Layout.all_movies, null);
        }
    }
}

找不到碎片类.膨胀

从Xamarin Android 5.0开始,名称的定义方式发生了重大变化。更多信息请参见:https://developer.xamarin.com/releases/android/xamarin.android_5/xamarin.android_5.0/#Android_Callable_Wrapper_Naming

您需要做的是指定要在Java端定义的实际名称。使用Register属性。

namespace MovieHall.Client.Android.Views.Fragments
{    
    [Register("moviehall.client.android.views.fragments.AllMoviesView")]
    public class AllMoviesView : MvxFragment
    {
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var ignore =  base.OnCreateView(inflater, container, savedInstanceState);
            return this.BindingInflate(Resource.Layout.all_movies, null);
        }
    }
}

注意:我不确定为什么你使用Activity属性,因为这是一个片段。