Android自定义Dialog中Include布局内TextView无法setText问题求助
问题根源:操作了错误的TextView实例
嘿,这个问题我一眼就看出来啦——你现在操作的resultTxt根本不是Dialog界面上显示的那个TextView!
你看这段代码:
final View resultLayout = View.inflate(getActivity(), R.layout.result_block,null); final TextView resultTxt = resultLayout.findViewById(R.id.result_txt);
你单独inflate了一个result_block布局,这里面的TextView是内存中独立的一个实例,完全和你通过<include>标签加到Dialog布局里的那个没关系。你给这个“隐形”的TextView设置文本,当然不会在界面上看到任何变化啦。
解决方案:从Dialog的根视图中获取正确的控件实例
只需要两步就能解决:
- 删掉多余的inflate代码:把
final View resultLayout = View.inflate(getActivity(), R.layout.result_block,null);这行代码删掉,它完全没用,还会误导你。 - 从Dialog的根视图
dialogView中查找控件:所有需要操作的控件(包括resultTxt、btn1)都要从dialogView里获取,因为Dialog界面上的所有控件都属于这个根视图的层级:// 直接从dialogView获取include布局里的TextView final TextView resultTxt = dialogView.findViewById(R.id.result_txt); // 同样,btn1也要从dialogView获取 final ImageButton btn1 = dialogView.findViewById(R.id.btn1);
修改后的核心代码片段
调整后的showDiag()方法关键部分应该是这样:
private void showDiag() { final View dialogView = View.inflate(getActivity(), R.layout.custom_dialog_layout,null); final Dialog dialog = new Dialog(getActivity(), R.style.MyAlertDialogStyle); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(dialogView); // 从dialogView中获取正确的控件实例 final TextView resultTxt = dialogView.findViewById(R.id.result_txt); final ImageButton btn1 = dialogView.findViewById(R.id.btn1); final CardView resultCardView = dialog.findViewById(R.id.result_card_view); final TextInputEditText editText = dialog.findViewById(R.id.text_edit); final ImageButton clearText = dialog.findViewById(R.id.clear_text); MaterialButton resultConfirm = dialog.findViewById(R.id.result_confirm); ImageButton btn2 = dialogView.findViewById(R.id.copy_btn); ImageButton btn3 = dialogView.findViewById(R.id.share_btn); // 后续的点击事件逻辑保持不变即可 resultConfirm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!editText.getText().toString().equals("")) { String theWord = editText.getText().toString(); String result = Utils.getSecondWord(theWord); resultTxt.setText(result); // 现在这行就能生效啦! insertWord(theWord, result); resultCardView.setVisibility(View.VISIBLE); } else { Toast.makeText(getActivity(), "Error", Toast.LENGTH_SHORT).show(); } } }); // ... 其他点击事件逻辑不变 }
额外说明
为什么按钮点击看起来正常?因为你代码里的btn2和btn3是从dialogView里获取的,所以它们是界面上真实存在的按钮;但btn1是从那个多余的resultLayout里获取的,它的点击事件其实根本不会触发,你可以测试一下,点击界面上的btn1应该不会打印日志哦~
内容的提问来源于stack exchange,提问作者Atlas91
相关产品推荐
相关产品推荐

