2013年6月11日火曜日

ClassCastException android.widget.* cannot be cast to android.widget.*

ClassCastException android.widget.* cannot be cast to android.widget.*

下記のエラーが出た。
具体例1.java.lang.ClassCastException: android.widget.ImageView cannot be cast to android.widget.Button

具体例2.java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.Button

私が遭遇した上記エラーのViewの階層構造の概念図は次のとおりである。
<LinearLayout> parent
    <LinearLayout> child
        <Button> has it's original ID.

<LinearLayout> parentの場所から、ButtonのIDをfindViewById()を使って指定して、そのButtonを使うことはできるし、エラーは発生しなかった。アプリに1個しか存在しないIDの値を使うのであるから問題はない。

この方法で以前は問題なく動作していたが、原因は不明であるが、ある時点以降、ButtonのIDを指定すると、「それはImageViewなのでButtonにcastすることはできない」という趣旨のエラーが出て、アプリがクラッシュするようになった。エラー発生箇所によっては、ImageViewではなく、LinearLayoutであったりTextViewであったりした。XMLやIDを調べたが、ButtonはButtonであった。しかしながら、ImageViewであるとされるIDの値は、ButtonのIDの値と同一なのである。このImageViewは私には身に覚えのないViewだ。変だね。

そこで、日本人が得意とするゲーム感覚で、<LinearLayout> childの場所から、つまり、Buttonの直接上のViewから、ButtonのIDを指定して使ったところ、問題無く動作するようになった。
非論理的不都合には、非論理的対応をするのが良いのかもしれない。むむむ!

なお、<LinearLayout> childでは、addView()やremoveAllViews()を使って、その内部にViewを実行時に加えたり削除したりしていた。

0 件のコメント:

コメントを投稿