2016-12-04 50 views
-2

我有一个扩展了LinearLayout的类。该类具有一个接口,该接口由实例化它来侦听点击事件的片段实现。我的问题是,在LinearLayout类中,我无法弄清楚如何实例化回调对象。实例化接口对象时的ClassCastException

public class SelectionView extends LinearLayout { 

    OnSelectionClickedListener mCallback; 
    LinearLayout mSelection; 

    public interface OnSelectionClickedListener { 
     void onSelected(SelectionView view); 
    } 

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

    public void init() { 

     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     final LinearLayout viewGroup = (LinearLayout) inflater.inflate(R.layout.selection, this); 

     mSelection = (LinearLayout) viewGroup.findViewById(R.id.selection_container); 
     mCallback = (SelectionClickedListener) this; 

     // ... 
} 

我得到的错误是在最后一行:

造成的:java.lang.ClassCastException: com.mysite.myapp.SelectionView不能转换到 com.mysite。 myapp.SelectionView $ OnSelectionClickedListener

我试过的,而不是this其他几个Context对象,但我总是对一些变化0错误。为了纠正这个问题,我需要做些什么?谢谢。

回答

1
mCallback = (SelectionClickedListener) this; 

thisSelectionViewSelectionView不实现它自己的SelectionClickedListener接口。

我已经尝试了一些其他的上下文中的对象,而不是这个

this不是ContextthisSelectionView

该类有一个接口,通过实例化它来监听点击事件的片段实现。

片段不是Context。没有Context对象将是你的片段。

为了纠正这个,我需要做些什么?

步骤#1:添加setOnSelectionClickedListener()方法SelectionView,采取SelectionClickedListener对象作为参数。使用它来填充你的mCallback字段。

步骤#2:让你的片段电话setOnSelectionClickedListener(),提供其SelectionClickedListener。如果片段本身是在片段实施SelectionClickedListener,然后的方法,thisSelectionClickedListener,所以你可以调用setOnSelectionClickedListener(this)

+0

非常感谢。这非常有帮助。我卡住试图实现这一点。如果你不介意,你可以看看我的OP的编辑吗?再次感谢! (伟大的书,顺便说一句)。 – Alex

+0

@Alex:您的错误消息与代码不匹配。它指的是'OnSportSelectionClickedListener'(你不会显示)和'OnClickListener'(大概是'View.OnClickListener',你在这里似乎没有用到)。你确定这次崩溃是来自编辑中的代码吗?另外,感谢您的亲切的话! – CommonsWare

+0

对不起,应该说'OnSelectionClickedListener'。是的,它来自我发布的代码(虽然有很多遗漏,但这里没有关系)。我想我需要多思考一下。再次感谢。 – Alex