10

その型のオブジェクトを AIDL 経由でリモート サービスに渡すことができるように、内部クラスを Parcelable にする方法を知る必要があります。これに関する情報が見つかりません。

これは私が達成しようとしているコードの例ですが、Bar クラスの CREATOR を静的にできないため (つまり、内部クラスにあるため)、コンパイルされません。Bar を静的内部クラスにすることはできず、Bar を Foo クラスの外 (システム内の他の依存関係) に移動することもできません。また、AIDL ファイル内から Bar クラスを参照する方法も知っておく必要があります。どんな助けでも大歓迎です。

public class Foo implements Parcelable
{
    private int a;

    public Foo()
    {
    }

    public Foo(Parcel source)
    {
        this.a = source.readInt();
    }

    public int describeContents()
    {
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags)
    {
        dest.writeInt(this.a);
    }

    public static final Parcelable.Creator<Foo> CREATOR
    = new Parcelable.Creator<Foo>()
    {
        ...
    }

    public class Bar implements Parcelable
    {
        private int b;

        public Bar()
        {
        }

        public Bar(Parcel source)
        {
            this.b = source.readInt();
        }

        public int describeContents()
        {
            return 0;
        }

        public void writeToParcel(Parcel dest, int flags)
        {
            dest.writeInt(this.b);
        }

        public static final Parcelable.Creator<Bar> CREATOR
        = new Parcelable.Creator<Bar>()
        {
            ...
        }
    }
}
4

4 に答える 4

8

私は最近同じ問題に遭遇し、内部クラスを静的にすることが私の状況で機能しました。

なぜこれが実際に機能するのかを読んで、より理にかなっているので、共有したいと思いました. 内部クラスは、別のクラス内にネストされ、その包含クラスのインスタンス化への参照を持つクラスです。その参照を通じて、包含クラス自体であるかのように、包含クラスのメンバーにアクセスできます。したがって、それは包含クラスのインスタンスにバインドされ、静的メンバーを持つことはできません (それらは包含クラスにバインドされないため)。

ネストされたクラスを static として宣言すると、それを含むクラスのインスタンスから分離されるため、独自の静的変数 (および通常のクラスが持つことができるその他のもの) を持つことができます。もちろん、含まれているクラスのメンバーにアクセスすることはできません。

于 2014-01-14T18:05:43.973 に答える
3

答えは、内部クラスはいつでも独自のクラスにすることができるということです。内部クラスが外部クラスのインスタンスからアクセスする必要がある機能、またはその逆の機能は、常にインターフェイスまたはパブリック API を介して実行できます。Bar を独自のクラスにしてみてください。Foo Bar のコンポーネントがアクセスする必要があるものは何でも、Foo のインスタンスを Bar に渡すことによって提供し、適切な API を実装します。

于 2012-01-27T00:50:01.327 に答える
1

外部クラスが内部クラス インスタンスへの参照を保持している場合、次のようにできます。

public class OuterClass implements Parcelable
{
    private InnerClass reference;

    protected OuterClass( Parcel source )
    {
        this.reference = new InnerClass( source );
        // ...
    }

    @Override
    public void writeToParcel( Parcel destination, int flags )
    {
        reference.writeToParcel( destination, flags );
        // ...
    }

    public class InnerClass implements Parcelable
    {
        protected InnerClass( Parcel source )
        {
            // Read from your parcel.
        }

        @Override
        public void writeToParcel( Parcel destination, int flags )
        {
            // Write to your parcel.
        }
    }

    public static final Parcelable.Creator<OuterClass> CREATOR = new Creator<OuterClass>()
    {
         @Override
         public OuterClass createFromParcel( Parcel source )
         {
             return new OuterClass( source );
         }

         @Override
         public OuterClass[] newArray( int size )
         {
             return new OuterClass[size];
         }
    }
}
于 2012-12-02T19:28:31.590 に答える