6

Android Studio を使用して最初に開発したプロジェクトがあります。Xamarin (Visual Studio 2015) に変換することにしました。

すべてのコードを何時間も移植した後、設定アクティビティ (PreferenceActivity) を除いてすべてが機能します。設定を構成するPreferenceFragmentsがいくつかありますが、それらのすべてで「フラグメントをインスタンス化できません」と表示されます。これが私が得ている例外です:

Java.Lang.RuntimeException: アクティビティ ComponentInfo を開始できませんパブリックな空のコンストラクター

私は解決策をオンラインで探していましたが、見つけられないようです。どこを見ても、空のパブリックコンストラクターがあることを確認してください。内部クラスが静的でなければならない場合は。しかし、空のコンストラクターがあり、それは内部クラスではなく、独自のファイルにあります。

これが私の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.

全般的 CheckBoxPreference

これは、に ctor を提供しなくても機能しましたGeneralPreferenceFragment。ただし、これらを追加してみてください:

public GeneralPreferenceFragment()
{
}

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

後者の ctor は、アプリがバックグラウンドから戻ってきたとき、または Java ワールドが何らかの方法でクラスを呼び出しているときによく必要になります。

于 2016-04-05T20:49:03.040 に答える