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会显示保存的数据。我有什么遗漏吗?