InstantiationException: No se puede instanciar fragmento Asegúrese de que el nombre de clase existe, es público y tiene un constructor vacío que es público

Tengo un proyecto que desarrollé originalmente con Android Studio. Decidí convertirlo a Xamarin (Visual Studio 2015).

Después de horas de portar todo el código, todo funciona excepto para mi actividad de Configuración (PreferenceActivity). Tengo algunos fragmentos de preferencia que componen la configuración, pero todos ellos me dan "No se puede instanciar fragmento". Aquí está la excepción que estoy recibiendo:

Java.Lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {test.mypackagename / md50d00e677e41fc49f8b3c16e79df2b77f.SettingsActivity}: android.app.Fragment $ InstantiationException: No se puede instanciar el fragmento test.mypackagename.GeneralPreferenceFragment: asegúrese de que el nombre de clase existe, es público y tiene Un constructor vacío que es público

He estado buscando en línea para una solución, pero simplemente no puedo parecen encontrar uno. Dondequiera que miro dicen asegurarse de que hay un constructor público vacío, si es una clase interna tiene que ser estática. Pero tengo el constructor vacío y su no una clase interna, su en su propio archivo.

Aquí está mi 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); } } } 

Aquí está mi 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); } } } 

Y aquí está mi 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> 

Esto estaba funcionando muy bien antes, así que no estoy seguro de cuál podría ser el problema. Cualquier ayuda sería muy apreciada.

Creo que se está ejecutando en este problema, porque cuando no se utiliza el atributo [Register] en su PreferenceFragment continuación, su nombre añadido con una suma MD5 por Xamarin.

Así que para tener el espacio de nombres que esperas en el pref_headers.xml debes atribuir tu clase:

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

EDITAR:

Acabo de probar el código y funciona bien en mi máquina. No estoy usando paquetes de soporte ni nada.

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); } } 

Esto funciona bien y la aplicación muestra la SettingsActivity con la primera opción general, después de hacer clic en que muestra un título y CheckBox .

General CheckBoxPreference

Esto funcionó incluso sin proporcionar ningún controlador al GeneralPreferenceFragment . Sin embargo, puede intentar agregar estos:

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

El último ctor es a menudo necesario cuando la aplicación está regresando de fondo o cuando el mundo Java está invocando la clase de alguna manera.

  • ¿Cuál es el valor de REQUEST_CHECK_SETTINGS?
  • Xamarin Android Google Maps App mapa está en blanco y sin error
  • Operador '! =' No se puede aplicar a los operandos de tipo 'Tarea' e 'int'
  • Bloquee la orientación de la pantalla a la vertical al escanear con la librería Zxing, la aplicación Xamarin.android.
  • Uso de la memoria de aplicaciones Android de Xamarin
  • Quiero crear thread temporizador para Android con Xamarin
  • Color del borde para el editor en Xamarin.Forms
  • Xamarin vs iOS nativo y Android
  • Tablas de la barra de acción de Android, Styling el icono y el texto juntos
  • ¿Cómo puedo enlazar a `ItemClick` para un` MvxLinearLayout`?
  • ¿Cómo funciona Xamarin iOS y Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.