片段内的自定义布局

Custom layout within fragment

我有一个包含自定义布局和事件侦听器的片段,用于处理用户与自定义视图的交互。但是我在片段内设置事件侦听器时遇到空指针异常。在这里,我发现自定义视图引用在片段中为空。

public class CustomCalendarView extends LinearLayout {

private EventListener eventListener;
public CustomCalendarView(Context context, AttributeSet attrs) 
{
    super(context);
    ............
    cellView = (GridView) findViewById(R.id.calendar_grid);
    cellView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            if (eventListener == null)
                return false;

            eventListener.onDayLongPress((Date) adapterView.getItemAtPosition(i));
            return true;
        }
    });
}

public void setEventListener(EventListener eventListener) {
    this.eventListener = eventListener;
}

public interface EventListener {
    void onDayLongPress(Date date);
}

}

public class DescribeFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    View view = inflater.inflate(R.layout.fragment_explore_planner, container, false);
    MainActivity activity = (MainActivity) getActivity();

    customCalendarView = ((CustomCalendarView) view.findViewById(R.id.calendar_view));
    customCalendarView.setEventListener(new CustomCalendarView.EventListener() {
        @Override
        public void onDayLongPress(Date date) {
            Toast.makeText(getContext(), timeFormatter.format(date), Toast.LENGTH_SHORT).show();
        }
    });

}

具体哪里出错了?有3种可能性。首先,customCalendarView 可以为空。检查 fragment_explore_plannercalendar_view 和 id R.id.calendar_view。其次,作为参数传递给 EventListenerDate 对象可以为空。检查 adapterView 是否为空或包含 i 位置。还要检查 timeFormatter.

我发现我没有从自定义视图的构造函数中调用 super(context, attrs)。 在将上下文和属性作为参数的构造函数中将 super(context) 更改为 super(context, attrs) 解决了我的问题。