日历代码在 activity 中有效,但在片段中无效
calendar code worked in activity but not in fragment
我在使用 Calendar 的 Activity class 中编写了一段代码,然后将其移至 Fragment,并且我通过调用将此片段动态附加到 Activity: `
mFragmentManager = 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 上设置文本的那一行给出 NullPointerException,说它不能在空对象引用上设置文本。
替换此代码
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);
Activity 是您在其上膨胀片段的地方。但是所有 TextView 都是片段 xml 的一部分,您必须从片段的视图而不是 activity 的视图访问它们。
我在使用 Calendar 的 Activity class 中编写了一段代码,然后将其移至 Fragment,并且我通过调用将此片段动态附加到 Activity: `
mFragmentManager = 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 上设置文本的那一行给出 NullPointerException,说它不能在空对象引用上设置文本。
替换此代码
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);
Activity 是您在其上膨胀片段的地方。但是所有 TextView 都是片段 xml 的一部分,您必须从片段的视图而不是 activity 的视图访问它们。