在修复手动重构时引入的错误时,我发现我将这段代码放在片段的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的错误,我不知道答案。我以前从未真正考虑过,因此我搜索并检查了手册,但找不到答案,所以有人可以告诉我原因吗?
答案 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()
回调。任何依赖于完全“启动并运行”活动的东西都应该放在这里。