Xamarin Android 如何在Fragment的点击事件中访问TextView控件
报错原因
你在OnCreateView方法内定义的genderButton是局部变量,作用域仅限制在OnCreateView方法内部,所以外部的独立点击事件方法无法访问该变量。
下面是3种可行的解决方法:
方法1:将控件提升为Fragment类的成员变量(最常用,适合需要在多个方法里操作控件的场景)
把需要跨方法访问的控件定义为Fragment类的全局成员,在OnCreateView里完成赋值即可:
public class FragmentHome : AndroidX.Fragment.App.Fragment { // 定义类成员变量 private TextView _genderButton; public override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); } public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.Inflate(Resource.Layout.fragment_home, container, false); // 给成员变量赋值 _genderButton = view.FindViewById<TextView>(Resource.Id.genderButton); TextView secondButton = view.FindViewById<TextView>(Resource.Id.secondButton); TextInputEditText firstInput = view.FindViewById<TextInputEditText>(Resource.Id.firstInput); // 设置点击事件 _genderButton.Click += GenderButton_Click; return view; } private void GenderButton_Click(object sender, System.EventArgs e) { // 直接访问类成员变量 if (_genderButton.Text == "Male") { _genderButton.Text = "Female"; } else { _genderButton.Text = "Male"; } } }
方法2:从点击事件的sender参数获取触发控件(无需额外定义变量,适合仅在点击事件内操作当前触发控件的场景)
点击事件的sender参数本身就是触发该事件的控件实例,直接强转即可使用:
private void GenderButton_Click(object sender, System.EventArgs e) { // 直接从sender强转得到控件实例 var genderButton = (TextView)sender; if (genderButton.Text == "Male") { genderButton.Text = "Female"; } else { genderButton.Text = "Male"; } }
方法3:使用Lambda内联点击事件(适合逻辑简单、不需要复用点击事件的场景)
Lambda表达式可以捕获当前上下文的局部变量,不需要额外修改变量作用域:
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.Inflate(Resource.Layout.fragment_home, container, false); TextView genderButton= view.FindViewById<TextView>(Resource.Id.genderButton); TextView secondButton = view.FindViewById<TextView>(Resource.Id.secondButton); TextInputEditText firstInput = view.FindViewById<TextInputEditText>(Resource.Id.firstInput); // 用Lambda写内联点击事件,直接捕获当前的genderButton局部变量 genderButton.Click += (s, e) => { if (genderButton.Text == "Male") { genderButton.Text = "Female"; } else { genderButton.Text = "Male"; } }; return view; }
内容的提问来源于stack exchange,提问作者NETDev
相关产品推荐
相关产品推荐

