2016-12-04 4 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

Я попробовал несколько других Context объектов вместо this, но у меня всегда есть некоторые вариации ClassCastException. Что мне нужно сделать, чтобы исправить это? Благодарю.

ответ

1
mCallback = (SelectionClickedListener) this; 

this является SelectionView. SelectionView не использует свой собственный интерфейс SelectionClickedListener.

Я попробовал несколько других объектов Context вместо этого

this не Context. this - SelectionView.

Этот класс имеет интерфейс, который реализуется фрагментом, который создает его для прослушивания событий щелчка.

Фрагмент не является Context. Нет объекта Context, который будет вашим фрагментом.

Что мне нужно сделать, чтобы исправить это?

Шаг 1: Добавьте метод setOnSelectionClickedListener() к SelectionView, принимая SelectionClickedListener объект в качестве параметра. Используйте это, чтобы заполнить поле mCallback.

Шаг № 2: Отправьте фрагмент на номер setOnSelectionClickedListener(), указав его SelectionClickedListener. Если сам фрагмент реализует SelectionClickedListener, то в методе в фрагменте, this является SelectionClickedListener, и поэтому вы можете позвонить setOnSelectionClickedListener(this).

+0

Большое спасибо за это. Это очень полезно. Я застреваю, пытаясь реализовать это. Если вы не возражаете, можете ли вы посмотреть на редактирование моего ОП? Еще раз спасибо! (великая книга, кстати). – Alex

+0

@Alex: Ваше сообщение об ошибке не соответствует коду. Он относится к 'OnSportSelectionClickedListener' (который вы не показываете) и' OnClickListener' (предположительно 'View.OnClickListener', который вы, кажется, не используете здесь). Вы уверены, что этот краш из кода в вашем редактировании? Кроме того, спасибо за добрые слова! – CommonsWare

+0

Извините, это должно было сказаться 'OnSelectionClickedListener'. Да, это из кода, который я опубликовал (хотя есть совсем немного, но ничего, что должно иметь значение здесь). Думаю, мне нужно подумать об этом чуть больше. Еще раз спасибо. – Alex

Смежные вопросы