EditText内容无法保存问题求助(附代码示例)
问题分析与解决方案
看起来你的问题出在EditText的引用作用域以及可能的View复用导致的引用失效上,让我一步步帮你解决:
核心问题点
- 你定义的
bevasarlolista如果是局部变量(比如在OnBindViewHolder或者某个方法内部声明),当方法执行完毕后,这个引用会失去效力,等到按钮点击时,它可能指向的是一个已经被回收或者错误的View实例,导致获取不到输入的文本。 - 另外,在C#中直接用
==比较字符串可能会因为引用不同导致判断异常(不过你说Toast能弹出,说明这个条件是成立的,但还是建议规范写法)。
修复步骤
1. 将EditText声明为类成员变量
把EditText bevasarlolista从局部变量改成类的成员变量,确保在点击回调中能访问到正确的实例:
// 在类的顶部声明成员变量 private string lista; private EditText bevasarlolista; // 在View初始化完成的地方(比如Fragment的OnCreateView或者Activity的OnCreate)获取引用 public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { var view = inflater.Inflate(Resource.Layout.YourLayout, container, false); bevasarlolista = view.FindViewById<EditText>(Resource.Id.bevasarlo); // 其他初始化代码... return view; }
2. 优化按钮点击事件的实现
如果你的代码是在列表(比如RecyclerView)的绑定逻辑里,最好通过点击事件的sender来获取当前的View上下文,避免因为View复用导致的引用错误:
// 绑定按钮点击事件的代码 if (string.Equals(items[position], "Bevásárlólista", StringComparison.Ordinal)) { Button mentes = view.FindViewById<Button>(Resource.Id.hozzaad); bevasarlolista.Text = lista; // 移除旧的点击事件(避免重复绑定) mentes.Click -= bevasarlolistaMentese; mentes.Click += bevasarlolistaMentese; } // 点击回调方法优化 private void bevasarlolistaMentese(object sender, EventArgs e) { Button clickedBtn = sender as Button; if (clickedBtn == null) return; // 从当前按钮的父容器中获取EditText实例 EditText currentEditText = clickedBtn.Parent.FindViewById<EditText>(Resource.Id.bevasarlo); if (currentEditText != null) { lista = currentEditText.Text; Toast.MakeText(Application.Context, currentEditText.Text, ToastLength.Long).Show(); } }
3. 额外注意事项
- 确保你的EditText的
Resource.Id.bevasarlo在布局文件中是唯一且正确的,没有拼写错误。 - 如果是在RecyclerView中,记得在
OnBindViewHolder中更新EditText的文本时,要基于当前项的数据,避免数据错乱。
这样修改后,你应该就能正确获取到EditText中的输入内容,Toast也会显示你输入的文本了!
内容的提问来源于stack exchange,提问作者Zoltan Kiraly
相关产品推荐
相关产品推荐

