我有一个我最初使用Android Studio开发的项目。我决定将它转换为Xamarin(Visual Studio 2015)。
在移植所有代码几个小时之后,除了我的设置活动(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)
我认为您遇到了这个问题,因为当您不使用[Register]
上的PreferenceFragment
属性时,其名称会附加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
。
这甚至没有向GeneralPreferenceFragment
提供任何信息。但是,您可以尝试添加以下内容:
public GeneralPreferenceFragment()
{
}
public GeneralPreferenceFragment(IntPtr javaRef, JniHandleOwnership transfer)
: base(javaRef, transfer)
{
}
当应用程序从后台返回或者Java世界以某种方式调用该类时,通常需要使用后者。