You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:21:23