检索自定义视图时出现ClassCastException

时间:2014-02-17 15:07:32

标签: android android-layout

我有这样的布局:

<com.mypackage.QuadPaneHorizontalSplit
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<!-- more views here -->

</com.mypackage.QuadPaneHorizontalSplit>

QuadPaneHorizo​​ntalSplit类扩展了QuadPaneLayout(扩展了LineraLayout):

public class QuadPaneHorizontalSplit extends QuadPaneLayout {

    public QuadPaneHorizontalSplit(Context context) {
        super(context);
    }

    public QuadPaneHorizontalSplit(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public QuadPaneHorizontalSplit(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected boolean isVerticalSplit() {
        return false;
    }

}

使用setContentView设置布局后,我尝试检索自定义视图:

QuadPaneLayout quadPaneLayout = (QuadPaneLayout) findViewById(R.id.root_layout);

一般来说效果很好,但我得到了一些崩溃报告,但有以下例外:

  

java.lang.ClassCastException:com.mypackage.QuadPaneHorizo​​ntalSplit   无法转换为com.mypackage.QuadPaneLayout

QuadPaneHorizo​​ntalSplit显然扩展了QuadPaneLayout,因此不应该有例外。我收到Android 4.x设备和不同制造商的崩溃报告。有趣的是,所有的设备都扎根,所以也许这是一个自定义rom的问题?请注意,这行代码每天执行数千次没有问题,到目前为止我只有13次崩溃(BugSense),但我还是想深究这一点。

我知道这一点:https://stackoverflow.com/a/7823787/534471但是我没有在此布局中使用include,我不想添加合并代码,因为这可能会产生不良影响。

任何人都知道这里发生了什么?

2 个答案:

答案 0 :(得分:1)

我终于找到了这个问题的答案,也可能是其他开发人员感兴趣的。

由于我有很多其他无法解释的崩溃,包括VerifyErrors,ClassNotFoundExceptions和ActivityNotFoundExceptions,我对这些崩溃报告的来源产生了怀疑。我添加了一些“额外的代码”,以确保应用程序没有被篡改,如果是错误报告将显示这一点。事实上,所有ClassCastException崩溃都发生在我的应用程序的实例中,这些崩溃显然已经破解,这也解释了为什么我只为应用程序的付费版本获取此崩溃报告,以及为什么付费应用程序似乎比免费应用程序更频繁地崩溃。 / p>

也许是时候花这笔额外的钱购买DexGuard牌照了......

答案 1 :(得分:0)

嗯......有时这种情况发生在我身上,但一旦我清理了项目,通常会解决这个问题。在这种情况下,这似乎是os / device / user特定的。您多久从QuadPaneHorizo​​ntalSplit投射到QuadPaneLayout?你是否有另一个“R.id.root_layout”实例,它不是同一个View对象?也许这导致了这个问题?

编辑:没关系,我忘了ClassCastException是专门从QuadPaneHorizo​​ntalSplit到QuadPaneLayout,所以它可能不是“R.id.root_layout”的另一个实例。您从BugSense获得了哪些其他信息?