Android:如何解决方法间全局变量取值为null的问题?
问题分析与解决:全局变量
items分享时为null的问题 问题根源
- 全局变量
items仅在saveChecklist()方法中被赋值,但点击分享按钮(R.id.share_note)时,并没有触发saveChecklist(),此时items还是初始的null值。 - 另外,
saveChecklist()执行后会调用finish()关闭当前Activity,就算先点保存再点分享,Activity已经销毁,分享操作根本无法执行。
解决方案:抽离生成items的逻辑,分享前主动更新值
最优方案是把生成checklist内容的逻辑单独抽出来,不管是保存还是分享,都调用这个方法获取最新内容,避免依赖saveChecklist()的赋值。
- 新增方法专门生成当前checklist的字符串内容:
private String generateChecklistItems() { ArrayList<String> itemList = new ArrayList<>(); for (int i = 0; i < linearLayout.getChildCount(); i++) { View v = linearLayout.getChildAt(i); EditText etChecklistItem = v.findViewById(R.id.et_checklist_item); // 处理空输入的情况,避免加入空字符串 String itemText = etChecklistItem.getText().toString().isEmpty() ? "" : etChecklistItem.getText().toString(); itemList.add(itemText); } StringBuilder stringBuilderItem = new StringBuilder(); for(String singleItem: itemList) { stringBuilderItem.append(singleItem); stringBuilderItem.append("\n"); } return stringBuilderItem.toString(); }
- 修改
saveChecklist()方法,用新方法赋值items:
public void saveChecklist(){ Intent intent = new Intent(); ArrayList<String> statusList = new ArrayList<>(); String status; // 保留原有的状态收集逻辑 for (int i = 0; i < linearLayout.getChildCount(); i++) { View v = linearLayout.getChildAt(i); CheckBox checkBox = v.findViewById(R.id.check_box); status = checkBox.isChecked() ? "1" : "0"; statusList.add(status); } // 替换成新方法生成items items = generateChecklistItems(); StringBuilder stringBuilderStatus = new StringBuilder(); for(String singleStatus: statusList){ stringBuilderStatus.append(singleStatus); stringBuilderStatus.append("\n"); } String statuses = stringBuilderStatus.toString(); dbHelper.insertChecklist(statuses, items, DateTime.date(), DateTime.time(), System.currentTimeMillis()); setResult(RESULT_OK,intent); Toast.makeText(this, "Checklist saved...", Toast.LENGTH_SHORT).show(); finish(); overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right); }
- 修改
onOptionsItemSelected()的分享分支,先更新items再分享:
case R.id.share_note: items = generateChecklistItems(); Share.shareNote(this, items); break;
这样不管用户有没有先保存,点击分享时都会实时获取当前所有checklist项的内容,不会再出现null的情况。
可选方案:必须保存后再分享
如果业务要求必须先保存才能分享,可以调整saveChecklist()的逻辑,允许保存后不立即关闭Activity:
- 修改
saveChecklist(),添加参数控制是否关闭Activity:
public void saveChecklist(boolean shouldFinish){ // 原有保存逻辑完全不变,仅修改最后finish的部分 // ... if(shouldFinish){ finish(); overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right); } }
- 更新其他调用
saveChecklist()的地方:
// 返回按钮 case android.R.id.home: saveChecklist(true); return true; // 保存按钮 case R.id.btn_save: saveChecklist(true); break; // 返回键 @Override public void onBackPressed() { super.onBackPressed(); saveChecklist(true); overridePendingTransition(0, 0); }
- 修改分享分支逻辑:
case R.id.share_note: // 先保存但不关闭Activity saveChecklist(false); // 保存完成后执行分享 Share.shareNote(this, items); break;
内容的提问来源于stack exchange,提问作者neverStop
相关产品推荐
相关产品推荐

