Android 为什么在重新创建活动时我的savedInstanceState为空?

Android 为什么在重新创建活动时我的savedInstanceState为空?,android,android-activity,android-lifecycle,android-navigation,Android,Android Activity,Android Lifecycle,Android Navigation,我通读了activity lifecycle Android文档,我认为我做得对,但它不起作用。有一个courseId,我正在使用它来生成活动课程的内容。当我单击此活动的ListView中的某个项目时,它会将我带到另一个活动。当我导航回“向上”活动课程时,我想保持courseId,以便再次充气屏幕 当导航到新活动时,MyonSaveInstanceSTate()override似乎正在按预期工作。但是当我返回到原始活动时,onCreate()声明它收到的savedInstanceState为nu

我通读了activity lifecycle Android文档,我认为我做得对,但它不起作用。有一个
courseId
,我正在使用它来生成活动课程的内容。当我单击此活动的ListView中的某个项目时,它会将我带到另一个活动。当我导航回“向上”活动课程时,我想保持
courseId
,以便再次充气屏幕

当导航到新活动时,My
onSaveInstanceSTate()
override似乎正在按预期工作。但是当我返回到原始活动时,
onCreate()
声明它收到的savedInstanceState为
null
。我错过了什么

第一个和最后一个方法是我的重点,但我已经包含了上下文的所有方法

public class Activity_Course extends ActionBarActivity {

    static final String COURSE_ID = "Activity_Course.COURSE_ID";
    public int courseId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_course);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.course_activity_frame, new CourseActivityFragment()).commit();
            Intent intent = getIntent();
            courseId = intent.getIntExtra(MainFragment.COURSE_ID, 0);
            System.out.println("the saved state was null");  // This prints!
        } else {
            courseId = savedInstanceState.getInt(COURSE_ID);
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.course, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public static class CourseActivityFragment extends Fragment {

        View rootView;
        int courseId;
        DBAdapter db;
        ListView GradeTypeListView;
        Adapter_GradeTypeList gtAdapter;
        public final static String CATEGORY_ID = "MY_CATEGORY_ID";

        public ArrayList<Category> gradeTypeList = new ArrayList<Category>();

        public CourseActivityFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.activity_course_fragment,
                    container, false);

            db = new DBAdapter(this.getActivity());
            courseId = ((Activity_Course) this.getActivity()).courseId;
            db.open();
            Course course = db.getCourse(courseId);
            db.close();

            TextView header = (TextView)rootView.findViewById(R.id.course_header);
            ((TextView) rootView.findViewById(R.id.course_semester)).setText(course.getSemesterString());
            header.setText(course.getTitle());

            LinearLayout catHeader = (LinearLayout) rootView.findViewById(R.id.linLayCatheader);
            TextView tv = (TextView)catHeader.findViewById(R.id.category_column);
            TextView tv2 = (TextView)catHeader.findViewById(R.id.weight_column);
            TextView tv3 = (TextView)catHeader.findViewById(R.id.gradecount_column);
            TextView tv4 = (TextView)catHeader.findViewById(R.id.percentage_column);
            tv.setText(R.string.cat_header);
            tv2.setText(R.string.weight_header);
            tv3.setText(R.string.count_header);
            tv4.setText(R.string.percent_header);

            setListData();

            Resources res = getResources();
            GradeTypeListView = (ListView) rootView.findViewById(R.id.gtListView);

            gtAdapter = new Adapter_GradeTypeList(this.getActivity(), gradeTypeList, res, this);
            GradeTypeListView.setAdapter(gtAdapter);

            System.out.println("how many?   " + GradeTypeListView.getChildCount());

            View v = GradeTypeListView.getChildAt(2);

            return rootView;
        }

        public void setListData()
        {
            db.open();
            Category[] gt = db.getCategoriesInCourse(courseId);
            db.close();
            if(gt!=null){
                for(int i = 0; i < gt.length; i++) {
                    gradeTypeList.add(gt[i]);
                }
            }
        }

         public void onItemClick(int position){
             System.out.println(gradeTypeList.get(position).getType());
             System.out.println("taken from adapter is, title is..   " + gtAdapter.getItem(position).getType());

                Intent i = new Intent(this.getActivity(), Activity_Category.class);
                i.putExtra(CATEGORY_ID, gtAdapter.getItem(position).getCourseId());
                i.putExtra(MainFragment.COURSE_ID, courseId);
                startActivity(i);
            }
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState){
        savedInstanceState.putInt(COURSE_ID, courseId);
        // this print shows correctly!
        System.out.println("courseId I'm saving is... " + courseId); 
        super.onSaveInstanceState(savedInstanceState);
    }
}
公共课堂活动\u课程扩展了ActionBarActivity{
静态最终字符串COURSE\u ID=“Activity\u COURSE.COURSE\u ID”;
公共国际课程ID;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_课程);
如果(savedInstanceState==null){
getSupportFragmentManager().beginTransaction()
.add(R.id.course_activity_frame,new CourseActivityFragment()).commit();
Intent=getIntent();
courseId=intent.getIntExtra(MainFragment.courseId,0);
System.out.println(“保存的状态为空”);//此打印!
}否则{
courseId=savedInstanceState.getInt(课程ID);
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.course,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
公共静态类CourseActivityFragment扩展片段{
视图根视图;
int courseId;
DBAdapter-db;
ListView等级类型ListView;
适配器等级类型列表GT适配器;
公共最终静态字符串CATEGORY\u ID=“MY\u CATEGORY\u ID”;
public ArrayList gradeTypeList=新建ArrayList();
公共课程活动片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
rootView=充气机。充气(R.layout.activity\u course\u片段,
货柜(虚假);;
db=newdbadapter(this.getActivity());
courseId=((活动\课程)this.getActivity()).courseId;
db.open();
Course=db.getCourse(courseId);
db.close();
TextView头=(TextView)rootView.findViewById(R.id.course\u头);
((TextView)rootView.findviewbyd(R.id.course\u学期)).setText(course.getSemesterString());
header.setText(course.getTitle());
LinearLayout catHeader=(LinearLayout)rootView.findviewbyd(R.id.linLayCatheader);
TextView tv=(TextView)catHeader.findViewById(R.id.category_列);
TextView tv2=(TextView)catHeader.findViewById(R.id.weight_列);
TextView tv3=(TextView)catHeader.findViewById(R.id.gradecount_列);
TextView tv4=(TextView)catHeader.findViewById(R.id.percentage_列);
tv.setText(R.string.cat_头);
tv2.setText(R.string.weight_头);
tv3.setText(R.string.count_头);
tv4.setText(R.string.percent_头);
setListData();
Resources res=getResources();
GradeTypeListView=(ListView)rootView.findViewById(R.id.gtListView);
gtAdapter=newadapter\u GradeTypeList(this.getActivity(),GradeTypeList,res,this);
GradeTypeListView.setAdapter(gtAdapter);
System.out.println(“多少?”+GradeTypeListView.getChildCount());
视图v=GradeTypeListView.getChildAt(2);
返回rootView;
}
public void setListData()
{
db.open();
类别[]gt=db.getCategoriesInCourse(courseId);
db.close();
如果(gt!=null){
对于(int i=0;i
您的片段中的onCreate中缺少了
setRetainInstance(true)
,我在另一个问题上找到了这个答案。这正是我要找的。