随机ClassCastExceptions使用findViewById显然随机视图

时间:2016-03-20 13:58:04

标签: android android-layout android-support-library classcastexception layout-inflater

我不认为自己是一位经验丰富的开发人员,但我可以说我有足够的经验来避免ClassCastException视图:我知道哪个视图与哪个ID相关联在我的布局中。

发生的事情是我在以下方面遇到了愚蠢的崩溃:

TextView v = (TextView) view.findViewById(R.id.my_text_view);
ClassCastException: cannot cast AppCompatImageView to TextView

在应用的不同部分,但不是以可重现的方式(每次我执行该特定操作时都不会发生这种情况)。这让我发疯了!

实施例

// IN A AppCompatDialogFragment
// R.layout.sheet_menu is a frame with only two childs:
// a TextView and a RecyclerView.

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.sheet_menu, container, false);
}    

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    titleView = (TextView) view.findViewById(R.id.menu_sheet_title);
    list = (RecyclerView) view.findViewById(R.id.menu_sheet_list);

    // CLASSCASTEXCEPTION! Cannot cast AppCompatTextView to RecyclerView!
}

另一个:

// IN A RECYCLERVIEW ADAPTER
// Inflating the view holder layout with
// View.inflate(mContext, R.layout.editable_story, null);

private class EditableStoryHolder extends PrimaryHolder {

    public EditableStoryHolder(View itemView) {
        super(itemView);
        ...
        likes = (TextView) itemView.findViewById(R.id.likes_count);

        // CLASSCASTEXCEPTION! Cannot cast AppCompatImageView to TextView
    }

仔细检查

我从不明确地调用removeView或其他任何东西

  • 我正在导入正确的包R

  • 我正在使用的ID在所有项目中都是唯一,我很确定它们不会在我的任何依赖项中使用

那么,发生了什么?为什么findViewById会返回错误的孩子?我正在使用支持库v.23.2.1在API23上进行测试。这是一个非常新的问题。 appcompat布局inflater出了什么问题?

2 个答案:

答案 0 :(得分:0)

有时生成的R文件变得不同步(不确定为什么,但我经常遇到这个问题)

只需选择Build - >清理项目即可。清洁项目

这应该重新生成R文件并解决问题,每次向布局添加新视图时都可能需要清理项目

答案 1 :(得分:0)

您是否引入了会影响LayoutInflater或相关工厂的库?确保充气机创建正确的视图。我认为您可以调试LayoutInflater.java以确保一切正常。