Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android InstanceionException:无法实例化片段,请确保类名存在、是公共的,并且有一个空的公共构造函数_Android_Xamarin_Preferencefragment_Instantiationexception - Fatal编程技术网

Android InstanceionException:无法实例化片段,请确保类名存在、是公共的,并且有一个空的公共构造函数

Android InstanceionException:无法实例化片段,请确保类名存在、是公共的,并且有一个空的公共构造函数,android,xamarin,preferencefragment,instantiationexception,Android,Xamarin,Preferencefragment,Instantiationexception,我有一个最初使用Android Studio开发的项目。我决定将其转换为Xamarin(Visual Studio 2015) 在移植了数小时的所有代码之后,除了我的设置活动(PreferenceActivity)之外,其他一切都正常工作。我有几个PreferenceFragment组成了设置,但它们都给了我“无法实例化fragment”。以下是我得到的一个例外: Java.Lang.RuntimeException:无法启动活动组件信息{test.mypackagename/md50d00e6

我有一个最初使用Android Studio开发的项目。我决定将其转换为Xamarin(Visual Studio 2015)

在移植了数小时的所有代码之后,除了我的设置活动(PreferenceActivity)之外,其他一切都正常工作。我有几个PreferenceFragment组成了设置,但它们都给了我“无法实例化fragment”。以下是我得到的一个例外:

Java.Lang.RuntimeException:无法启动活动组件信息{test.mypackagename/md50d00e677e41fc49f8b3c16e79df2b77f.SettingsActivity}:android.app.Fragment$InstanceException:无法实例化Fragment test.mypackagename.GeneralReferenceFragment:确保类名存在,是公共的,并且有一个公共的空构造函数

我一直在网上寻找解决方案,但似乎找不到。无论我看到哪里,他们都说确保有一个空的公共构造函数,如果它是一个内部类,那么它必须是静态的。但是我有一个空构造函数,它不是一个内部类,而是在它自己的文件中

以下是我的设置Activity.cs:

namespace test.mypackagename
{
    public class SettingsActivity : PreferenceActivity
    {
        protected override void OnPostCreate(Bundle savedInstanceState)
        {
            base.OnPostCreate(savedInstanceState);
        }

        public override void OnBuildHeaders(IList<Header> target)
        {
            LoadHeadersFromResource(Resource.Xml.pref_headers, target);
        }
    }
}
这是我的pref_headers.xml:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">

    <header android:fragment="test.mypackagename.GeneralPreferenceFragment"
        android:title="@string/pref_header_general" />

    <header android:fragment="test.mypackagename.OtherPreferenceFragment1"
        android:title="@string/pref_header_other1" />

    <header android:fragment="test.mypackagename.OtherPreferenceFragment2"
        android:title="@string/pref_header_other2" />

    <header android:fragment="test.mypackagename.OtherPreferenceFragment3"
        android:title="@string/pref_header_other3" />

    <header android:fragment="test.mypackagename.OtherPreferenceFragment4"
        android:title="@string/pref_header_other4" />

</preference-headers>


这是工作的好之前,所以我不知道什么问题可能。任何帮助都将不胜感激。

我认为您遇到了这个问题,因为在您的
首选项片段上不使用
[Register]
属性时,它的名称会被Xamarin附加一个MD5总和

因此,为了在pref_headers.xml中实际拥有您期望的名称空间,您需要为类添加属性:

[Register("test.mypackagename.GeneralPreferenceFragment")]
public class GeneralPreferenceFragment: PreferenceFragment
{
    // code here
}
编辑:

我刚刚测试了代码,它在我的机器上运行良好。我没有使用任何支持包或任何东西

pref_general.xml

<?xml version="1.0" encoding="utf-8" ?> 
<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
            android:title="durr">
        <CheckBoxPreference
                android:key="checkbox_preference"
                android:title="herp"
                android:summary="derp" />
    </PreferenceCategory>
</PreferenceScreen>
<?xml version="1.0" encoding="utf-8" ?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
  <header android:fragment="test.mypackagename.GeneralPreferenceFragment"
      android:title="general" />
</preference-headers>
这工作正常,应用程序会显示
设置活动
,首先是一个常规选项,点击后会显示标题和
复选框

即使没有向
GeneralReferenceFragment
提供任何构造函数,这种方法也可以工作。但是,您可以尝试添加以下内容:

public GeneralPreferenceFragment()
{
}

public GeneralPreferenceFragment(IntPtr javaRef, JniHandleOwnership transfer)
    : base(javaRef, transfer)
{
}

当应用程序从后台返回或Java世界以某种方式调用该类时,通常需要后一个ctor。

谢谢,但不幸的是,这并没有解决问题。但是,我注意到,如果我将Register属性放在setingsactivity上,则异常不再包含MD5和。但正如我所说的,问题仍然存在。你是如何开始设置活动的?从我的主要活动中,我有一个选项菜单,我覆盖了选项项Selected,从那里我调用StartActivity(新意图(这个,typeof(SettingsActivity));我想看看可复制的样品。因为我不能让它从我在答案中提供的代码中分离出来。哇,我感觉真的很傻,当我添加Register属性时,我在单词“Fragment”中有一个拼写错误。很抱歉浪费你的时间。但你最初的回答是正确的!非常感谢如果这仍然是一个问题,你可能想上传一个简单的复制本。
[Activity(Label = "SettingsActivity")]
public class SettingsActivity : PreferenceActivity
{
    public override void OnBuildHeaders(IList<Header> target)
    {
        LoadHeadersFromResource(Resource.Xml.pref_headers, target);
    }
}
[Register("test.mypackagename.GeneralPreferenceFragment")]
public class GeneralPreferenceFragment : PreferenceFragment
{
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        AddPreferencesFromResource(Resource.Xml.pref_general);
    }
}
public GeneralPreferenceFragment()
{
}

public GeneralPreferenceFragment(IntPtr javaRef, JniHandleOwnership transfer)
    : base(javaRef, transfer)
{
}