Xamarin.Forms Android中TableView内Entry组件异常问题求助
解决TableView中Entry首次点击焦点丢失的问题
这个问题我在Xamarin.Forms开发中碰见过好几次,本质是TableView的单元格和内部Entry之间的焦点抢占导致的,给你几个实用的解决办法:
方法一:在Entry的Focused事件中强制锁定焦点
第一次点击Entry时,可能TableView的ViewCell先获取了焦点,导致Entry的焦点被“抢走”,我们可以在Entry的Focused事件里延迟一下,强制让Entry重新获取焦点:
TableView tableView = new TableView(); tableView.Intent = TableIntent.Form; tableView.BackgroundColor = Color.Blue; tableView.HasUnevenRows = true; var entry = new Entry() { WidthRequest = 100, BackgroundColor = Color.Red }; // 添加焦点处理逻辑 entry.Focused += (sender, e) => { Device.BeginInvokeOnMainThread(() => { // 如果焦点丢失,重新获取 if (!entry.IsFocused) { entry.Focus(); } }); }; tableView.Root = new TableRoot() { new TableSection() { new ViewCell() { View = entry } } };
方法二:用手势识别器直接触发Entry焦点
我们可以给ViewCell的View添加TapGestureRecognizer,拦截点击事件,直接让Entry获取焦点,跳过TableView的默认焦点逻辑:
TableView tableView = new TableView(); tableView.Intent = TableIntent.Form; tableView.BackgroundColor = Color.Blue; tableView.HasUnevenRows = true; var entry = new Entry() { WidthRequest = 100, BackgroundColor = Color.Red }; var viewCell = new ViewCell { View = entry }; // 添加点击手势 var tapGesture = new TapGestureRecognizer(); tapGesture.Tapped += (s, args) => { entry.Focus(); }; viewCell.View.GestureRecognizers.Add(tapGesture); tableView.Root = new TableRoot() { new TableSection() { viewCell } };
额外说明
如果你尝试用EntryCell仍然有同样问题,本质也是焦点抢占的逻辑导致的,同样可以给EntryCell的Entry属性绑定Focused事件,用方法一的逻辑来修复。
内容的提问来源于stack exchange,提问作者asaf
相关产品推荐
相关产品推荐

