gpt4 book ai didi

android - InstantiationException:无法实例化 fragment 确保类名存在,是公共(public)的,并且有一个空的公共(public)构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:29 24 4
gpt4 key购买 nike

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

在移植所有代码数小时后,除了我的设置 Activity (PreferenceActivity) 之外,一切正常。我有一些构成设置的 PreferenceFragments,但它们都给我“无法实例化 fragment ”。这是我得到的异常:

Java.Lang.RuntimeException: Unable to start activity ComponentInfo{test.mypackagename/md50d00e677e41fc49f8b3c16e79df2b77f.SettingsActivity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment test.mypackagename.GeneralPreferenceFragment: make sure class name exists, is public, and has an empty constructor that is public

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

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

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

最佳答案

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

关于android - InstantiationException:无法实例化 fragment 确保类名存在,是公共(public)的,并且有一个空的公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com