我在一个使用Calendar的Activity类中编写了一个代码,然后我将它移动到Fragment,我通过调用:
将这个片段动态地附加到ActivitymFragmentManager = getFragmentManager();
//mButtonsFragment = mFragmentManager.findFragmentById(R.id.fragment_buttons);
mLayout1to6 = (FrameLayout) findViewById(R.id.fragment_1to6);
final FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.add(R.id.fragment_1to6, f1to6);
ft.addToBackStack(null);
ft.commit();
mFragmentManager
.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
setLayout();
}
});
mFragmentManager.executePendingTransactions();
`
和片段代码本身是这样的:
public class Fragment_1to6 extends Fragment {
private Activity mActivity;
Calendar calendar;
String month_name;
TextView month1;
TextView month2;
TextView month3;
TextView month4;
TextView month5;
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment_1to6, container, false);
month1 = (TextView) mActivity.findViewById(R.id.monthView1);
month2 = (TextView) mActivity.findViewById(R.id.monthView2);
month3 = (TextView) mActivity.findViewById(R.id.monthView3);
month4 = (TextView) mActivity.findViewById(R.id.monthView5);
calendar = Calendar.getInstance();
setMonths();
return view;
}
public void setCurrentMonthName() {
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month_name = month_date.format(calendar.getTime());
month1.setText(month_name);
}
protected void getNextMonth(int i) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MMM");
switch (i) {
case 1:
calendar.add(Calendar.MONTH, 1);
month2.setText(dateFormat.format(calendar.getTime()));
break;
case 2:
calendar.add(Calendar.MONTH, 1);
month3.setText(dateFormat.format(calendar.getTime()));
break;
case 3:
calendar.add(Calendar.MONTH, 1);
month4.setText(dateFormat.format(calendar.getTime()));
break;
case 4:
calendar.add(Calendar.MONTH, 1);
month5.setText(dateFormat.format(calendar.getTime()));
break;
}
}
public void setMonths() {
setCurrentMonthName();
getNextMonth(1);
getNextMonth(2);
getNextMonth(3);
getNextMonth(4);
}
}
`
然而,当我运行它时,它在textViews上的setText行上给出NullPointerException,说它不能在Null对象引用上设置setText。
答案 0 :(得分:1)
替换此代码
month1 = (TextView) mActivity.findViewById(R.id.monthView1);
month2 = (TextView) mActivity.findViewById(R.id.monthView2);
month3 = (TextView) mActivity.findViewById(R.id.monthView3);
month4 = (TextView) mActivity.findViewById(R.id.monthView5);
与
month1 = (TextView) view.findViewById(R.id.monthView1);
month2 = (TextView) view.findViewById(R.id.monthView2);
month3 = (TextView) view.findViewById(R.id.monthView3);
month4 = (TextView) view.findViewById(R.id.monthView5);
活动是您在其上夸大片段的地方。但是所有的TextView都是片段xml的一部分,你必须从片段的视图中访问它们,而不是从活动的视图中访问它们。