2012-01-27 11 views
8

内部クラスParcelableを作成して、その型のオブジェクトをAIDL経由でリモートサービスに渡す方法を知っておく必要があります。私はこれに関する情報を見つけることができません。内部クラスを作成する方法Parcelable

ここでは私が達成しようとしているコードの例ですが、BarクラスのCREATORは静的ではないため(つまり内部クラスにあるため)、コンパイルされません。私はBarを静的な内部クラスにすることはできません.Fooクラスの外にBarを移動することはできません(システム内の他の依存関係)。また、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>() 
     { 
      ... 
     } 
    } 
} 
+0

あなたはこれがお手伝いしますhttp://stackoverflow.com/questions/35923039/android-implementing-parcelable-inner-classに見てみることができます。 – chaitanya

+0

この解決策を見てください。これはあなたを助けますhttp://stackoverflow.com/questions/35923039/android-implementing-parcelable-inner-class – chaitanya

答えて

3

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

+0

ありがとうございました。はい、理想的な解決策になります。しかし、私はFoo.Barを期待しているいくつかのjniコード(これは私がC++を再コンパイルしていない)とインターフェースしなければなりません(そしてBarを取得するとクラッシュします)。 – MichaelL

1

あなたはこのようにそれを行うことができます:私は最近、同じ問題に、私のような状況で働いていた内部クラスがstatic作る走っ

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]; 
     } 
    } 
} 
8

これは実際にはうまくいくと私には分かりやすいので、私は分かち合うと思った。内部クラスは、別のクラスの内部にネストされ、その内部クラスをインスタンス化するための参照を持ちます。その参照を通じて、クラスを含むクラスにアクセスすることができます。したがって、それは包含クラスのインスタンスにバインドされているため、静的メンバーを保持することはできません(これらのクラスを含むクラスにバインドされないため)。

静的としてネストされたクラスを宣言すると、それを含むクラスのインスタンスと切り離されます。そのため、独自の静的変数を持つことができます。もちろん、それを含むクラスのメンバーにアクセスすることはできません。

+0

ネストされたパーセル化可能なクラスを使用しているとき、内部パーセル可能なクラスを 'static'として宣言してくれました。 – Eido95

0

あなたのバーはParcelableである必要はありません。 FooフィールドとともにBarフィールドを保存し、createFromParcel(Parcel)メソッドでオブジェクト全体を復元するだけで済みます。ここで

は、例えば、前面いくつかのコードです:

import android.os.Parcel; 
import android.os.Parcelable; 

public class Foo implements Parcelable { 
    private int mFooData = 0; 
    private Bar mBar; 

    public Foo() { 
    } 

    protected Foo(Parcel in) { 
     mFooData = in.readInt(); 

     // Reading Bar 
     int barData = in.readInt(); 
     mBar = new Bar(barData); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(mFooData); 

     // Writing Bar 
     dest.writeInt(mBar.getBarData()); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    public static final Creator<Foo> CREATOR = new Creator<Foo>() { 
     @Override 
     public Foo createFromParcel(Parcel in) { 
      return new Foo(in); 
     } 

     @Override 
     public Foo[] newArray(int size) { 
      return new Foo[size]; 
     } 
    }; 

    public class Bar { 
     private int mBarData = 0; 

     public Bar(int barData) { 
      mBarData = barData; 
     } 

     public int getBarData() { 
      return mBarData; 
     } 

     public void setBarData(int mBarData) { 
      this.mBarData = mBarData; 
     } 
    } 
} 
関連する問題