为什么我的onCreateView方法会被调用两次?

14

调试另一个问题时,我发现其中一个活动onCreateView方法被调用了两次。我是编程新手,不完全理解android在加载活动时如何调用这些方法,但我觉得它不应该被调用两次。尽管减少了大部分代码,我仍然看到我的System.out消息两次。

public class AddCourse extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_course);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new AddCourseFragment()).commit();
        }
    }

    public static class AddCourseFragment extends Fragment {

        View rootView;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.fragment_add_course,
                container, false);
                        System.out.println("I see this TWICE!!!!");
            return rootView;
        }       
    }
}

这几乎与我的主要活动实现完全相同,但那一个不会通过 onCreateView 两次。有什么想法吗?

我被要求提供我的 activity_add_course xml...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

     <fragment android:name="com.NsouthProductions.gradetrackerpro.AddCourse$AddCourseFragment"
         android:id="@+id/AddCourseFrag" 
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
</LinearLayout>

你能分享一下你的activity_add_course布局文件吗? - brwngrldev
@adavis,我已经添加了布局文件。 这是因为布局文件基本上调用了我的片段类吗?我应该如何阻止它被调用两次? - NSouth
看起来你正在两次添加该片段。如果你在XML中声明了它,那么你就不需要再以编程方式添加它了。 - brwngrldev
@adavis ,嗯,我应该从代码的哪个部分删除它?如果不调用我的片段两次,我该如何处理空的savedInstanceState?抱歉,我仍在努力掌握一些基础知识。 - NSouth
1个回答

29

看起来你重复添加了片段。 如果在xml中声明了它,那么就不需要以编程方式添加它。

您可以从您的Activity的onCreate()方法中删除这个内容:

if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new AddCourseFragment()).commit();
        }

谢谢。在这里写了一个长问题后,我终于推断出savedInstanceState条件代码是为了确保片段得到膨胀。但由于主布局已经膨胀了它,所以这个代码是不需要的。我希望没有其他副作用。谢谢! - NSouth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接