为什么必须在片段onStart方法中实例化EditText小部件

时间:2018-09-07 17:07:36

标签: android android-fragments android-edittext

在修复手动重构时引入的错误时,我发现我将这段代码放在片段的onCreateView方法中,而不是onStart中。

    EditText et = getActivity().findViewById(R.id.testEditText);
    et.setOnEditorActionListener(new TextView.OnEditorActionListener()
    {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent event)
        {

            boolean handled = false;

            if (actionId == EditorInfo.IME_ACTION_DONE)
            {
                // Do something.
                handled = true;
            }

            return handled;
        }
    });

修复了我发现自己在思考为什么CreateText小部件在onCreateView中为null的错误,我不知道答案。我以前从未真正考虑过,因此我搜索并检查了手册,但找不到答案,所以有人可以告诉我原因吗?

3 个答案:

答案 0 :(得分:0)

初始化应该在onCreateView方法中进行,而不是在onStart中进行。

初始化方式错误。

初始化片段的正确方法是:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
     Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.example_layout, parent, false);
    EditText et = (EditText) view.findViewById(R.id.editText1);

    et.setOnEditorActionListener(new TextView.OnEditorActionListener()
    {....}

}

答案 1 :(得分:0)

其原因可能是,在父活动onCreateView ()返回时,片段收到的回调onActivityCreated()之前调用了片段的onCreate()。因此,getActivity()onCreateView()中返回null,而在onStart()中起作用,而onActivityCreated()在回调之后被调用。

答案 2 :(得分:0)

答案与Fragment的生命周期及其托管Activity的生命周期如何相关。

在您发布的代码中,您正在活动中寻找EditText

EditText et = getActivity().findViewById(R.id.testEditText);

从逻辑上讲这很好,但是它取决于两点。首先,活动必须存在,否则getActivity()将返回null。其次,活动必须已调用其setContentView()方法,否则findViewById()将返回null。

在片段的onCreateView()中,我们知道该活动已经附加,因此第一个问题很好。但是,不能保证活动的onCreate()方法已经完成,因此也不能保证已调用setContentView()

保证已完成其托管活动的片段生命周期中的第一个地方是片段的onCreate()回调。任何依赖于完全“启动并运行”活动的东西都应该放在这里。