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 扩展了视图,所以我可以将视图(RelativeLayout)分配给 XX 对象。

但它崩溃了。作业有什么问题?

编辑:

extends View改为extends RelativeLayout. 也View 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 定义中包是正确的。虽然如果这是错误的,你会得到一个类 not foudn 异常

编辑||

我试着运行这个:

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