Android开发求助:EditText获取getText().toString()返回null问题
问题根源与解决办法
你遇到的NullPointerException(去掉null判断后返回null)核心原因是:在onClick方法里,你调用的是view.findViewById(),这里的view是被点击的saveButton本身,而非Activity的根布局视图。Button作为单个控件,内部不可能包含txtEvent、txtComment这些EditText/TextView,所以每次获取都会返回null。
解决步骤
- 替换所有
view.findViewById()为Activity的findViewById()(直接调用即可,因为OnClickListener是Activity内部类,可以访问外部类的方法); - 建议把控件初始化移到
onCreate方法中,不用每次点击按钮都重复查找控件,提升性能; - 可以用更简洁的方式处理空值,避免冗长的if-else判断。
修改后的代码示例
// 把控件声明移到类成员位置 private EditText textViewEvent, textViewComment, textViewDateAdded; private TextView textViewDateAccessed; private Button saveButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 在onCreate中初始化所有控件 saveButton = findViewById(R.id.buttonSave); textViewEvent = findViewById(R.id.txtEvent); textViewComment = findViewById(R.id.txtComment); textViewDateAdded = findViewById(R.id.txtDateTime); textViewDateAccessed = findViewById(R.id.date_accessed); saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String eventName, eventComment, eventDateAdded, eventDateAccessed; SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss:SSS"); String date = sdf.format(new Date()); // 简化空值处理,EditText.getText()永远不会返回null,空输入时toString()得到空字符串 eventName = textViewEvent.getText().toString().trim(); eventComment = textViewComment.getText().toString().trim(); eventDateAdded = textViewDateAdded.getText().toString().trim(); // 如果日期输入为空,用当前日期填充 if (eventDateAdded.isEmpty()) { eventDateAdded = date; } eventDateAccessed = textViewDateAccessed.getText().toString().trim(); if (eventDateAccessed.isEmpty()) { eventDateAccessed = date; } Toast.makeText(getApplicationContext(), eventName + ":" + eventComment + ":" + eventDateAdded, Toast.LENGTH_SHORT).show(); database.insertNewEventDetails(eventName, eventComment, eventDateAdded, eventDateAccessed); refreshData(); } }); }
补充说明:Android中EditText.getText()永远不会返回null,所以只要在onCreate中正确初始化控件,就不需要判断控件是否为null。另外Toast的时长建议用Toast.LENGTH_SHORT或Toast.LENGTH_LONG,不要用硬编码的数字5。
内容的提问来源于stack exchange,提问作者Nesrene
相关产品推荐
相关产品推荐

