Android 为什么EditText小部件必须在fragment onStart方法中实例化
在修复手动重构时引入的错误时,我发现我将此代码放在片段的onCreateView方法中,而不是onStartAndroid 为什么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
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);