检索自定义视图时的 Android ClassCastException

Posted

技术标签:

【中文标题】检索自定义视图时的 Android ClassCastException【英文标题】:Android ClassCastException upon retrieving Custom View 【发布时间】:2011-10-19 03:17:39 【问题描述】:

我在尝试使用 findViewById() 获取自定义视图时遇到了问题。否则,自定义视图会正确显示和运行。不幸的是,我需要能够随意更改它显示的一些数据,所以必须这样做。

我的 XML 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_
  android:layout_>

  <com.TheProject.TheApp.Chart 
    android:id="@+id/chart"
    android:layout_
    android:layout_
  />

</LinearLayout>

我知道有时问题是人们不小心在 XML 中将组件命名为“视图”而不是其子类。

在我的 Activity 的 onCreate() 方法中,我有这个:

myChart=(Chart)findViewById(R.id.chart); //where myChart is an object of type Chart

这会引发 ClassCastException。

我决定尝试一下,而是将行改成这样,看看我是否仍然收到 ClassCastException:

View chart=(View)findViewById(R.id.chart);

这很好,它告诉我 findViewById 给我一个视图没有问题。但它不想给我一个图表。

就 Chart 类而言,它是 View 的一个非常简单的子类,看起来可以正常工作。

public class Chart extends View
    public Chart(Context context) 
    super(context);     
    init();


public Chart(Context context, AttributeSet attrs) 
    super(context, attrs);      
    init();


public Chart(Context context, AttributeSet attrs, int defStyle) 
    super(context, attrs, defStyle);        
    init();     

    /* More stuff below like onDraw, onMeasure, setData, etc. */

我可能只是在做一些愚蠢的事情。你们有什么想法吗?感谢您的帮助!

【问题讨论】:

图表有构造函数吗? 是的。 Chart 有所有 3 个构造函数。我已经编辑了我的帖子以显示它们。 【参考方案1】:

出于好奇,该 xml 是否正在另一个带有 &lt;include&gt; 标签的布局中使用?

我遇到了这样的问题,我们在 viewflipper 中包含另一个 xml 布局

&lt;include layout="@layout/some_layout.xml"&gt;findviewbyid 获取了错误的小部件。我必须将整个外部布局包装在 &lt;merge&gt;&lt;/merge&gt; 标签中,以使其正确合并到基本布局中。

如果包含,请尝试将您的布局更改为此。

<?xml version="1.0" encoding="utf-8"?>
<merge>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_
  android:layout_>

  <com.TheProject.TheApp.Chart 
    android:id="@+id/chart"
    android:layout_
    android:layout_
  />

</LinearLayout>
</merge>

编辑:查看 this link 了解合并的工作原理

【讨论】:

【参考方案2】:

这很可能是一个错误。

解决方法:在 Layout XML 和 findViewById() 中为 CustomView 使用一些新的“id”值。

【讨论】:

【参考方案3】:

findViewById 将始终返回 View 对象。您将只能访问视图类中指定的方法,并且您的 Chart 类的任何方法都不能访问。

如果您需要访问任何特定于图表的方法或数据,您需要将视图对象转换为 Chart。

【讨论】:

就是这样。将该 View 对象转换为 Chart 是什么给了我 ClassCastException。 图表chart=(Chart)findViewById(R.id.chart);这会导致异常吗?嗯,我很困惑,因为它不应该导致该错误。有时当我确定它不应该是错误时发生这样的错误时,我重新打开 eclipse 并清理项目。 我就是这么想的。我认为生成的代码搞砸了,这似乎最近发生了很多。每隔一段时间,完美工作的代码就会决定停止工作,因为它再也找不到按钮或其他东西。我确实已经清理了项目,但似乎没有帮助。 那么尝试从 Eclipse 中删除项目。然后从现有源创建一个新的 android 项目。或者您可能需要修改诸如更改文件名之类的代码。或者尝试仅使用自定义视图制作一个小型测试项目,看看是否仍然出现异常。

以上是关于检索自定义视图时的 Android ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

触发本地通知时的自定义视图

自定义 listView 行,带有复选框和旋转时的储蓄复选标记

列表视图中的Android联系人图像占位符

定向更改时的列表视图的自定义对话框(横向模式)

Android,Contacts Contract:存储和检索自定义数据

按下后退按钮时的自定义动画 - iOS