0

次のようなクラス XX を定義しました。

   public class XX extends RelativeLayout {
    protected static final boolean DEBUG = true;

    public XX(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    }

    public XX(Context context, AttributeSet attrs) {
    super(context, attrs);
    if (DEBUG)
        Log.i(this.getClass().getSimpleName(), " ->2"
            + Thread.currentThread().getStackTrace()[2].getMethodName());
    //getAttributes(context, attrs);

    }

    public XX(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    if (DEBUG)
        Log.i(this.getClass().getSimpleName(), " ->3"
            + Thread.currentThread().getStackTrace()[2].getMethodName());
    //getAttributes(context, attrs);

    }

}

私のコードでは、次のように書いています。

RelativeLayout v = (RelativeLayout) this.findViewById(R.id.switch_TCMyTB);
XX x = (XX) v;  //<----- crashes here

しかし、割り当てでクラッシュします。XX は View を拡張するため、ビュー (RelativeLayout) を XX オブジェクトに割り当てることができると思います。

しかし、それはクラッシュします。割り当ての何が問題になっていますか?

編集:

に変更extends Viewしましたextends RelativeLayoutView vにも変更RelativeLayout v。しかし、まだclassCastExceptionが発生します..???? なんで?

その間

RelativeLayout r = (RelativeLayout) v; 

確かにうまくいきます。

4

2 に答える 2

0

私はカスタムコンポーネントに完全に精通していないので、例を作成しようとしました。なぜそれが機能しないのかについてのあなたの質問に答えることはできません。私の例が実行されない場合は、logcatを提供する必要があります。

カスタムクラスを作成します。

public class TestLayout extends RelativeLayout {

    public TestLayout(Context context) {
        super(context);

    }

    public TestLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public TestLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
}

このクラスはパッケージcom.test.ccにあります

XMLレイアウトで私は使用します

    <com.test.cc.TestLayout 
    android:layout_width="10dip"
    android:layout_height="10dip"
    android:id="@+id/testLayout"    
    />

この例のレイアウトでは、TestLayoutはLinearLayoutの子です。xmlns:android="http://schemas.android.com/apk/res/android"xmlレイアウトの最上位コンポーネントである場合は追加します。

次に、アクティビティで:

//Called in onCreate mthod of an activity.    
setContentView(R.layout.test); //make sure you call this first
TestLayout l = (TestLayout)findViewById(R.id.testLayout);

これは私にとってはうまくいきます。

これは、2.2および3.2デバイスでテストされました。

したがって、必ず最初にsetContentView(...)を呼び出してから、レイアウトのオブジェクトを作成してください。また、xml定義でパッケージが正しいことを確認してください。これが間違っていた場合は、例外ではなくクラスが発生しますが

編集||

私はこれを実行してみました:

RelativeLayout l = (RelativeLayout)findViewById(R.id.testLayout);
TestLayout tl = (TestLayout)l;

また、例外なく正常に動作します。だから私は問題が他の場所にあると思います。たぶんパッケージ名のエラーか何か。

于 2012-05-23T11:10:18.170 に答える
0

次のコードはClassCastExceptionsなしで実行
されるため、エラーはXMLにある可能性があります。

public class Test {

  public static void main(String[] args) {
    B b = new B();
    Object o = b;
    A a = (A) o;
    B b2 = (B) a;
    System.out.println("done");
  }

  public static class A /* extends Object */ {
  }

  public static class B extends A {
  }
}
于 2012-05-23T11:39:46.673 に答える