Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么EditText小部件必须在fragment onStart方法中实例化_Android_Android Fragments_Android Edittext - Fatal编程技术网

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

Android 为什么EditText小部件必须在fragment onStart方法中实例化,android,android-fragments,android-edittext,Android,Android Fragments,Android Edittext,在修复手动重构时引入的错误时,我发现我将此代码放在片段的onCreateView方法中,而不是onStart EditText et = getActivity().findViewById(R.id.testEditText); et.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorActi

在修复手动重构时引入的错误时,我发现我将此代码放在片段的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;
        }
    });

修复了这个bug之后,我发现自己在思考为什么在onCreateView中EditText小部件是空的,我不知道答案。我以前从未真正考虑过这个问题,所以我在谷歌上搜索并查看了手册,但找不到答案,所以有人能告诉我原因吗?

初始化应该在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()
    {....}

}

这可能是因为当父活动的
onCreate()
返回时,在
onActivityCreated()
片段收到回调之前调用了片段的
onCreateView()
。因此,
getActivity()
onCreateView()
中重新运行一个空值,而在
onStart()
中工作,它在
onActivityCreated()
回调之后被调用。

答案与
片段的生命周期及其宿主
活动的生命周期排列有关

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

这在逻辑上是好的,但它依赖于两件事。首先,活动必须存在,否则
getActivity()
将返回null。其次,活动必须已调用其
setContentView()
方法,否则
findViewById()
将返回null

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


片段生命周期中保证其宿主活动已完成执行的第一个位置是片段的
onActivityCreated()
回调。任何依赖于完全“启动并运行”活动的内容都应该放在这里。

我以前尝试过,这样会生成空的EditText引用。如果有区别的话,我使用的是android.support.v4.app.Fragment,编译API 27,最小API 19,针对API 27,运行在API 26上。这就是我得出的结论,这就是为什么我将代码移动到onStart,奇怪的是,所有的TextView小部件在onCreate中都很好。你的edittext是片段布局还是活动布局的一部分?片段布局,就像所有其他小部件一样。很抱歉,我接受了Ben的答案,因为它比你的答案更清晰。在这方面,只有在阅读了Ben的答案后,我才发现你的答案暗指使用onActivityCreated。我希望我能接受这两个答案。这是有道理的,但我想我检查了所有的“onX”回调,我可能错过了onActivityCreated(),所以我会尝试一下,并让你知道它是否有效,谢谢你的建议。是的,很好,我在来这里之前已经检查了所有的onX方法,但我显然错过了,非常感谢,我终于可以开始删除我的片段了。
EditText et = getActivity().findViewById(R.id.testEditText);