MonoDroid:Fragment.Instantiate ClassNotFoundException

The*_*lTy 4 mono android xamarin.android

我正在尝试使用Mono for Android中的ActionBar创建一个滑动标签视图.

eclipse插件的adroid将此作为默认项目模板,我已设法将其转换,我现在正尝试添加功能以将我的片段分开.

当我尝试运行我的项目时,我得到一个ClassNotFoundException

这是片段的代码

using Fragment = Android.Support.V4.App.Fragment;

namespace MobileCompanion.AndroidOS.App.UI.Customers
{
    public  class HomeTab : Fragment
    {
        public override Android.Views.View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup viewGroup, Android.OS.Bundle p2)
        {

            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的部分适配器

using System.Collections.Generic;
using Android.Content;
using Android.OS;
using Android.Support.V4.App;
using Java.Lang;

namespace MobileCompanion.AndroidOS.App
{
    public class SectionsPagerAdapter : FragmentPagerAdapter
    {
        private readonly Context _context;
        public readonly IList<TabInfo> Tabs = new List<TabInfo>();
        private Bundle _bundle;

        public SectionsPagerAdapter(FragmentManager fm, Context context, Bundle savedInstanceState)
            : base(fm)
        {
            this._context = context;
            this._bundle = savedInstanceState;

        }

        public override Fragment GetItem(int i)
        {
            var args = new Bundle();
            var page = Fragment.Instantiate(this._context, typeof(HomeTab).FullName);
            //          var page = new HomeTab(); <<--- Work but nothing displayed as none of the create methods are run
            page.Arguments = args;
            return page;
        }

        public override int Count
        {
            get { return this.Tabs.Count; }
        }

        public override ICharSequence GetPageTitleFormatted(int p0)
        {
            return new String(this.Tabs[p0].PageTitle);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Java.Lang.RuntimeException:无法实例化片段MobileCompanion.AndroidOS.App.UI.Customers.HomeTab:确保类名存在,是公共的,并且
在Android.Runtime.JNIEnv.CallStaticObjectMethod(intptr,在/Users/builder/data/lanes/monodroid-mac-monodroid-4.2.4-branch/9f7cbd60/source/monodroid/src/Mono.Android/src/Runtime中的intptr,Android.Runtime.JValue [])[0x00024] /JNIEnv.g.cs:767

在Android.Support.V4.App.Fragment.Instantiate(Android.Content.Context,string)[0x00034] /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.4-branch/9f7cbd60/source/ MonoDroid的-绑定/兼容性-V4 /绑定/ OBJ /平台-14/SRC /生成/ Android.Support.V4.App.Fragment.cs:624

at MobileCompanion.AndroidOS.App.SectionsPagerAdapter.GetItem(int)[0x00007]在c:\ Projects\MobileCompanion\trunk\MobileCompanion.Android.App\SectionsPagerAdapter.cs:28

在Android.Support.V4.App.FragmentPagerAdapter.n_GetItem_I(intptr,intptr,int)[0x00008] /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.4-branch/9f7cbd60/source/monodroid-绑定/兼容性-V4 /绑定/ OBJ /平台-14/SRC /生成/ Android.Support.V4.App.FragmentPagerAdapter.cs:56

at(wrapper dynamic-method)object.780b3637-f853-4d6e-8435-9c92bc6a9dd5(intptr,intptr,int)

---托管异常堆栈跟踪结束---

android.support.v4.app.Fragment $ InstantiationException:无法实例化片段MobileCompanion.AndroidOS.App.UI.Customers.HomeTab:确保类名存在,是公共的,并且有一个公共的空构造函数

  at android.support.v4.app.Fragment.instantiate(Fragment.java:395)

  at android.support.v4.app.Fragment.instantiate(Fragment.java:363)

  at
Run Code Online (Sandbox Code Playgroud)

mobilecompanion.androidos.app.SectionsPagerAdapter.n_getItem(Native Method)

  at
Run Code Online (Sandbox Code Playgroud)

mobilecompanion.androidos.app.SectionsPagerAdapter.getItem(SectionsPagerAdapter.java:30)

  at
Run Code Online (Sandbox Code Playgroud)

android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:97)

  at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)

  at android.support.v4.view.ViewPager.populate(ViewPager.java:821)

  at android.support.v4.view.ViewPager.populate(ViewPager.java:772)

  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1234)

  at android.view.View.measure(View.java:12723)

  at
Run Code Online (Sandbox Code Playgroud)

android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)

  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)

  at android.view.View.measure(View.java:12723)

  at
Run Code Online (Sandbox Code Playgroud)

android.widget.LinearLayout.measureVertical(LinearLayout.java:812)

  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)

  at android.view.View.measure(View.java:12723)

  at
Run Code Online (Sandbox Code Playgroud)

android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)

  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)

  at
Run Code Online (Sandbox Code Playgroud)

com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2092)

  at android.view.View.measure(View.java:12723)

  at
Run Code Online (Sandbox Code Playgroud)

android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)

  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)

  at android.os.Handler.dispatchMessage(Handler.java:99)

  at android.os.Looper.loop(Looper.java:137)

  at android.app.ActivityThread.main(ActivityThread.java:4424)

  at java.lang.reflect.Method.invokeNative(Native Method)

  at java.lang.reflect.Method.invoke(Method.java:511)

  at
Run Code Online (Sandbox Code Playgroud)

com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)

  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

  at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

引起:java.lang.ClassNotFoundException:MobileCompanion.AndroidOS.App.UI.Customers.HomeTab

  at
Run Code Online (Sandbox Code Playgroud)

dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)

  at java.lang.ClassLoader.loadClass(ClassLoader.java:501)

  at java.lang.ClassLoader.loadClass(ClassLoader.java:461)

  at android.support.v4.app.Fragment.instantiate(Fragment.java:385)
Run Code Online (Sandbox Code Playgroud)

小智 11

命名空间必须全部小写Fragment.Instantiate才能工作.我相信这个限制是从Java继承的.

var page = Fragment.Instantiate(_activity, typeof(T).Namespace.ToLower() + "." +  
                                typeof(T).Name); 
Run Code Online (Sandbox Code Playgroud)

  • 命名空间必须是小写的,但类名本身需要处于正常的驼峰情况.例如:var page = Fragment.Instantiate(_ activity,typeof(T).Namespace.ToLower()+"."+ typeof(T).Name); (3认同)

Bra*_*ley 5

更好的答案是:

var page = Fragment.Instantiate (_activity, Java.Lang.Class.FromType(T).Name);
Run Code Online (Sandbox Code Playgroud)