找不到 class fragment.inflate
Cant find class for fragment.inflate
我正在使用本教程 http://blog.ostebaronen.dk/2013/07/fragments-and-viewpager-with-mvx.html.
在我的 android 应用程序中使用 ViewPager 实现选项卡式视图
在完成那里告诉的所有事情后,android 在尝试膨胀片段时抛出异常
Unable to instantiate fragment moviehall.client.android.views.fragments.AllMoviesView: make sure class name exists, is public, and has an empty constructor that is public.
经过一些研究,我发现的所有地方都暗示问题出在 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 class
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;
}
终于找到了这个class
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 端指定您要定义的实际名称。使用 注册 属性。
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 属性,因为这是一个片段。
我正在使用本教程 http://blog.ostebaronen.dk/2013/07/fragments-and-viewpager-with-mvx.html.
在我的 android 应用程序中使用 ViewPager 实现选项卡式视图在完成那里告诉的所有事情后,android 在尝试膨胀片段时抛出异常
Unable to instantiate fragment moviehall.client.android.views.fragments.AllMoviesView: make sure class name exists, is public, and has an empty constructor that is public.
经过一些研究,我发现的所有地方都暗示问题出在 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 class
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;
}
终于找到了这个class
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 端指定您要定义的实际名称。使用 注册 属性。
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 属性,因为这是一个片段。