片段内的自定义布局
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_planner
有 calendar_view
和 id R.id.calendar_view
。其次,作为参数传递给 EventListener
的 Date
对象可以为空。检查 adapterView
是否为空或包含 i
位置。还要检查 timeFormatter
.
我发现我没有从自定义视图的构造函数中调用 super(context, attrs)。
在将上下文和属性作为参数的构造函数中将 super(context) 更改为 super(context, attrs) 解决了我的问题。
我有一个包含自定义布局和事件侦听器的片段,用于处理用户与自定义视图的交互。但是我在片段内设置事件侦听器时遇到空指针异常。在这里,我发现自定义视图引用在片段中为空。
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_planner
有 calendar_view
和 id R.id.calendar_view
。其次,作为参数传递给 EventListener
的 Date
对象可以为空。检查 adapterView
是否为空或包含 i
位置。还要检查 timeFormatter
.
我发现我没有从自定义视图的构造函数中调用 super(context, attrs)。 在将上下文和属性作为参数的构造函数中将 super(context) 更改为 super(context, attrs) 解决了我的问题。