4

我有一个项目,最初是使用Android Studio开发的。我决定将它转换为Xamarin(Visual Studio 2015)。InstantiationException:无法实例化片段确保类名存在,是公共的,并且具有公共的空构造函数

经过几个小时的移植所有的代码,除了我的设置活动(PreferenceActivity)之外,一切工作。我有几个组成设置的PreferenceFragments,但他们都给我“无法实例化片段”。这是我收到的例外:

了java.lang.RuntimeException:无法启动活动ComponentInfo {test.mypackagename/md50d00e677e41fc49f8b3c16e79df2b77f.SettingsActivity}:android.app.Fragment $ InstantiationException:无法实例片段test.mypackagename .GeneralPreferenceFragment:确保类名称存在,是公开的,有一个空的构造函数,它是公共

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

这里是我的SettingsActivity.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); 
     } 
    } 
} 

这里是我的GeneralPreferenceFragment.cs:

namespace test.mypackagename 
{ 
    public class GeneralPreferenceFragment : PreferenceFragment 
    { 
     public GeneralPreferenceFragment() { } 

     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 
      AddPreferencesFromResource(Resource.Xml.pref_general); 
     } 
    } 
} 

这里是我的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> 

这是工作所以我很难确定这个问题会是什么。任何帮助将非常感激。

+0

如果这仍然是一个问题,您可能需要上传这个简单的复制。 –

回答

6

我认为你遇到了这个问题,因为当你的PreferenceFragment没有使用[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> 

pref_headers.xml

<?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> 

SettingsActivity.cs

[Activity(Label = "SettingsActivity")] 
public class SettingsActivity : PreferenceActivity 
{ 
    public override void OnBuildHeaders(IList<Header> target) 
    { 
     LoadHeadersFromResource(Resource.Xml.pref_headers, target); 
    } 
} 

GeneralPreferenceFragment。CS

[Register("test.mypackagename.GeneralPreferenceFragment")] 
public class GeneralPreferenceFragment : PreferenceFragment 
{ 
    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     AddPreferencesFromResource(Resource.Xml.pref_general); 
    } 
} 

能正常工作和应用程序显示了SettingsActivity与第一一般的选项,点击它显示了一个标题和CheckBox后。

General CheckBoxPreference

这甚至工作没有提供任何构造函数的GeneralPreferenceFragment。但是,你可以尝试添加这些:

public GeneralPreferenceFragment() 
{ 
} 

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

后者构造函数通常需要时,应用程序从背景或当回来Java世界中以某种方式调用类。

+0

谢谢,但不幸的是,这并没有解决问题。但是我注意到,如果我在SettingsActivity上添加了Register属性,则该异常不再包含MD5总和。但正如我所说,问题仍然存在。 –

+0

你是如何启动SettingsActivity的? – Cheesebaron

+0

从我的MainActivity我有一个选项菜单,我重写OnOptionsItemSelected,从那里我调用StartActivity(新的意图(this,typeof(SettingsActivity))); –

相关问题