6

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

经过数小时移植所有代码后,除了我的设置活动(PreferenceActivity)外,一切正常。我有一些构成设置的 PreferenceFragment,但它们都给了我“无法实例化片段”。这是我得到的例外:

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>

这之前工作正常,所以我不确定问题可能是什么。任何帮助将非常感激。

4

1 回答 1

9

我认为您遇到了这个问题,因为当不使用[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 世界以某种方式调用该类时,通常需要后一个 ctor。

于 2016-04-05T20:49:03.040 回答