4

Orijinal olarak Android Studio'yu kullanarak geliştirdiğim bir projem var. Xamarin'e (Visual Studio 2015) dönüştürmeye karar verdim.InstantiationException: Parça oluşturulamıyor, sınıf adının mevcut olduğundan, herkese açık olduğundan ve herkese açık boş bir kurucu olduğundan emin olun

Tüm kodları yükledikten sonra her şey, Ayarlar etkinliğim (PreferenceActivity) dışında çalışır. Ayarları oluşturan bazı PreferenceFragments'ım var, ama hepsi bana "Parçayı somutlaştırmıyor" veriyor.

java.lang.RuntimeException:: İşte alıyorum istisna değildir başlatılamıyor aktivite ComponentInfo {test.mypackagename/md50d00e677e41fc49f8b3c16e79df2b77f.SettingsActivity}: android.app.Fragment $ InstantiationException: fragman test.mypackagename örneğini edilemiyor .GeneralPreferenceFragment: emin sınıf adından var olun, herkese açıktır ve ben bir çözüm çevrimiçi aradım ama sadece cant bulmak görünmektedir

herkese açıktır olarak boş bir yapıcı sahiptir. Baktığım her yerde boş bir kamu kurucusu olduğundan emin olun, eğer bir iç sınıfın statik olması gerekiyorsa. Ama boş kurucum var ve onun bir iç sınıfı değil, kendi dosyasında. İşte

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

benim GeneralPreferenceFragment.cs geçerli::

namespace test.mypackagename 
{ 
    public class GeneralPreferenceFragment : PreferenceFragment 
    { 
     public GeneralPreferenceFragment() { } 

     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 
      AddPreferencesFromResource(Resource.Xml.pref_general); 
     } 
    } 
} 

Ve işte benim pref_headers.xml geçerli:

<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> 

Bu çalışıyordu İşte

benim SettingsActivity.cs olduğunu Bundan önce sorun ne olabilir emin değilim. Herhangi bir yardım çok takdir edilecektir.

+0

Bu sorun olmaya devam ederse, bunun basit bir yeniden yüklemesini yüklemek isteyebilirsiniz. –

cevap

6

Bu sorunla karşılaşıyorsunuz çünkü PreferenceFragment[Register] özniteliğini kullanmadığınız zaman adı Xamarin tarafından bir MD5 toplamına eklenmiştir.

Yani aslında size sınıf atfetme gerek pref_headers.xml içinde bunu bekliyoruz ad sahip olmak için:

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

DÜZENLEME:

Sadece test ettik kodu ve onu Makinemde iyi çalışıyor. Herhangi bir destek paketi veya hiç kullanmıyorum.

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

GenelÖncelikFragment.cs

[Register("test.mypackagename.GeneralPreferenceFragment")] 
public class GeneralPreferenceFragment : PreferenceFragment 
{ 
    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     AddPreferencesFromResource(Resource.Xml.pref_general); 
    } 
} 

Bu iyi çalışır ve uygulamamız Başlığı ve CheckBox görüntülenmesi anlamına tıkladıktan sonra, ilk genel seçeneği ile SettingsActivity gösterir.

General CheckBoxPreference

Bu GeneralPreferenceFragment herhangi ctor vermeden bile çalıştı. Ancak, bu ekleme deneyebilirsiniz:

public GeneralPreferenceFragment() 
{ 
} 

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

ikincisi ctor sıklıkla ihtiyaç duyulan uygulama Java dünyası nasılsa sınıf başlatıyordur arka plan veya zaman geri geliyor zaman.

+0

Teşekkürler ama maalesef bu sorunu çözmedi. Ancak, Register özniteliğini SettingsActivity'ye koyarsam, istisnanın artık MD5 toplamını içermediğini fark ettim. Ama dediğim gibi sorun hala devam ediyor. –

+0

AyarlarAktivite nasıl başlatılıyor? – Cheesebaron

+0

MainActivity kaynağımda Seçenekler menüsü var ve OnOptionsItemSelected öğesini geçersiz kılıyor, buradan StartActivity özelliğini arıyorum (yeni Intent (this, typeof (SettingsActivity))); –

İlgili konular