Android Fragment中CalendarView声明与初始化报错问题求助
Android Fragment中CalendarView初始化错误解决方法
情况一:成员变量声明时直接初始化报错
错误代码
public class FragmentCalendar extends Fragment { Calendar calendar; CalendarView calendarView = (CalendarView) findViewById(R.id.calendarView); Date date; }
报错信息
error: cannot find symbol
CalendarView calendarView = (CalendarView)findViewById(R.id.calendarView);
^
symbol: method findViewById(int)
location: class FragmentCalendar
原因
Fragment类本身没有findViewById()方法,这个方法是Activity类的成员方法。直接在Fragment的成员变量声明阶段调用它,编译器无法识别该方法。
情况二:onCreateView中初始化顺序错误导致空指针
错误代码
public class FragmentCalendar extends Fragment { Calendar calendar; CalendarView calendarView; Date date; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ calendar = calendar.getInstance(); date = calendar.getTime(); System.out.println("current date : "+date); calendarView.findViewById(R.id.calendarView); View view = inflater .inflate(R.layout.fragment_calendar, container, false); return view; } }
报错信息
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.widget.CalendarView.findViewById(int)' on a null object reference
at com.example.doodoobii.FragmentCalendar.onCreateView(FragmentCalendar.java:50)
原因
calendarView初始为null,直接调用它的findViewById()方法会触发空指针异常;- 正确逻辑是先将布局文件inflate成View对象,再通过这个View对象查找内部的CalendarView控件,而非反向操作。
正确的初始化方式
在onCreateView中,先完成布局inflate得到根View,再通过根View查找CalendarView:
public class FragmentCalendar extends Fragment { Calendar calendar; CalendarView calendarView; Date date; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ // 先inflate布局,获取Fragment的根View View view = inflater.inflate(R.layout.fragment_calendar, container, false); // 通过根View查找目标CalendarView控件 calendarView = view.findViewById(R.id.calendarView); // 后续业务逻辑 calendar = Calendar.getInstance(); date = calendar.getTime(); System.out.println("current date : "+date); return view; } }
补充说明
你的XML布局代码无问题,只需确保R.id.calendarView与布局文件中的控件id完全匹配即可。
内容的提问来源于stack exchange,提问作者learningLion
相关产品推荐
相关产品推荐

