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:
- ParseInstallation.SaveAsync () que causa UnhandledException en formularios Xamarin Android
- Cómo utilizar setOnTouchListener en C # (Xamarin)
- MvvmCross: ¿Cómo crear un MvxListView con un adaptador personalizado mediante programación?
- Xamarin C # EditText InputType Contraseña
- Cómo inflar una vista en expansión con una vista de relación de aspecto fija
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.
- ¿Cómo puedo resolver, "La aplicación en la que se basa este tipo de proyecto no se encontró." Error?
- Evitar que la actividad se reinicie cuando cambie la orientación
- ContextCompat.GetColor no devuelve Color
- IronPython en Xamarin
- Desactivar ViewRootImpl en Android Log?
- Android 5.0 hace que las casillas de verificación no seleccionadas sean invisibles cuando el fondo es blanco
- Error de compilación de Android C # Xamarin
- Xamarin Android Añadir texto del botón todos los casquetes - ¿Cómo aplicar el estilo a través de la aplicación?
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
.
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.
- ¿Cómo puedo añadir elevación (sombra) a mi BottomNavigationView. No viene por defecto
- No se puede mostrar AdMob Banner