Android 更改屏幕方向后,片段中的TextView内容丢失
根据标题,以下是我代码的一部分:Android 更改屏幕方向后,片段中的TextView内容丢失,android,textview,fragment,Android,Textview,Fragment,根据标题,以下是我代码的一部分: public class ExpensesDaily extends Fragment{ private int selectedYear, selectedMonth, selectedDay; private String displaySelectedDate; public ExpensesDaily(){} TextView tvDate; @Override public void onActivi
public class ExpensesDaily extends Fragment{
private int selectedYear, selectedMonth, selectedDay;
private String displaySelectedDate;
public ExpensesDaily(){}
TextView tvDate;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null){
if (savedInstanceState.getString("displaySelectedDate") != null){
String data = savedInstanceState.getString("displaySelectedDate");
Toast.makeText(getActivity(), "data state saved" + data, Toast.LENGTH_LONG).show();
tvDate = (TextView) getActivity().findViewById(R.id.tvSelectedDate);
tvDate.setText(data);
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View rootView = inflater.inflate(R.layout.expenses_daily, container, false);
ImageButton imgBtnChangeDate = (ImageButton) rootView.findViewById(R.id.imgBtnChangeDate);
imgBtnChangeDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatePickerFragment dpf = new DatePickerFragment().newInstance();
dpf.setCallBack(onDate);
dpf.show(getFragmentManager().beginTransaction(), "DatePickerFragment");
}
});
return rootView;
}
DatePickerDialog.OnDateSetListener onDate = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
displaySelectedDate = String.valueOf(year) + "-" + String.valueOf(monthOfYear)
+ "-" + String.valueOf(dayOfMonth);
tvDate = (TextView) getActivity().findViewById(R.id.tvSelectedDate);
tvDate.setText(displaySelectedDate);
}
};
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString("displaySelectedDate", displaySelectedDate);
}
}
在我成功地在TextView tvDate中设置了一个值并更改了方向后,logcat将返回此错误
由:java.lang.NullPointerException在Expensesday.onCreate(Expensesday.java:38)引起的
哪个指向这条线
tvDate.setText(data);
知道那行为什么会触发nullpointerexception错误吗
更新:根据用户3249477的回答,NPE错误不再出现。但是,文本视图仍然没有使用保存的数据进行更新
更多信息:我应该早点告诉你(起初我认为这对我的问题没有任何影响),这个类通常是另一个片段NavigationDrawerFragment中的一个片段。这里我的项目使用的是NavigationDrawer项目,它是在Android Studio中选择NavigationDrawer项目时自动创建的。请不要在片段的onCreate中使用getActivity
而是在创建活动时使用它(在片段的onActivityCreated
内部)
这是因为片段可以在活动之前创建,然后getActivity方法将返回null,因此NPE。阅读本文后,我似乎错过了在片段中保留对象的最重要部分:
setRetainInstance(true);
无论如何,首先我将代码setRetainInstance(true);在我的expensesday.java中,但我会得到一个错误
FATAL EXCEPTION: main java.lang.IllegalStateException: Can't retain fragements that are nested in other fragments
但是当我将代码设置为setRetainInstance(true)时;在NavigationDrawerFragment.java中的onCreate()中,我的问题得到了解决
因此,我希望我在这里的简单经历能帮助其他有同样问题的人。我已将onCreate更改为onActivityCreated,如上所示。现在不会发生错误,但TextView不会显示保存的数据。但它上面一行中的toast会显示保存的数据。我有什么遗漏吗?