You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android .NET(VS2022)中ListView的OnCreateContextMenu未被调用问题求助

Android .NET(VS2022)中ListView的OnCreateContextMenu未被调用问题求助

我在使用Visual Studio 2022开发原生Android .NET应用(既不是Xamarin.Forms也不是MAUI)时,碰到了一个头疼的问题:我的ListView能正常加载显示数据,但长按列表条目完全唤不出上下文菜单,OnCreateContextMenu方法从来没被执行过。之前搜过2013年有类似的帖子,但现在环境不一样了,试了各种办法都没解决,求各位大佬帮忙排查一下!


Activity 代码

[Activity(Label = "OrderListActivity")]
public class ListOrderActivity : Activity
{
    ListView LVOrders;
    Button btnClose;

    protected override void OnCreate(Bundle? savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.ListOrder);

        LVOrders = FindViewById<ListView>(Resource.Id.ListViewOrders);
        btnClose = FindViewById<Button>(Resource.Id.btnCloseListOrder);
        btnClose.Click += btnClose_Click;

        // 已注册ListView的上下文菜单
        RegisterForContextMenu(LVOrders);
        LVOrders.Adapter = new ListViewOrdersAdapter(this);
    }

    public override void OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo menuInfo)
    {
        base.OnCreateContextMenu(menu, v, menuInfo);
        MenuInflater.Inflate(Resource.Layout.CtxMenu, menu);
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
        Finish();
    }
}

ListView 布局文件(ListOrder.axml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btnCloseListOrder"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_weight="0.1"
        android:text="@string/btnClose"
        android:padding="10dp"
        android:layout_margin="5dp"
        android:textSize="30sp" />
    <ListView
        android:id="@+id/ListViewOrders"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.9"
        android:cacheColorHint="#FFDAFF7F"
        android:divider="@android:color/transparent"/>
</LinearLayout>

上下文菜单布局(CtxMenu.axml)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/context_menu_item1" android:title="Action 1" />
    <item android:id="@+id/context_menu_item2" android:title="Action 2" />
</menu>

ListView 适配器代码

public class ListViewOrdersAdapter : BaseAdapter<OrderDto>
{
    Activity context;

    public ListViewOrdersAdapter(Activity context) : base()
    {
        this.context = context;
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override OrderDto this[int position]
    {
        get { return KingsScanOrdersBiz.ListOrders[position]; }
    }

    public override int Count
    {
        get 
        { 
            if (KingsScanOrdersBiz.ListOrders == null) 
                return 0; 
            return KingsScanOrdersBiz.ListOrders.Count; 
        }
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        var item = KingsScanOrdersBiz.ListOrders[position];
        View view = convertView;

        if (view == null)
        {
            view = context.LayoutInflater.Inflate(Resource.Layout.OrderListRowView, null);
        }

        String code = item.ToString();

        TextView txtview = view.FindViewById<TextView>(Resource.Id.OrderListRowView_OrderId);
        TextView txtviewQty = view.FindViewById<TextView>(Resource.Id.OrderListRowView_NbProdId);

        txtviewQty.Text = $"{item.Items.Count} On : {item.CreatedDate:yyyy-MM-dd} Send : {GetDateFormat(item.DateSend)} ";
        txtview.Text = code;

        txtview.Tag = position;

        LinearLayout txtParent = (LinearLayout)txtview.Parent;
        txtParent.SetBackgroundColor(new Color(168, 196, 37));

        return view;
    }

    private object GetDateFormat(DateTime? dateSend)
    {
        if (!dateSend.HasValue)
        {
            return "";
        }
        return dateSend.Value.ToString("yyyy-MM-dd");
    }

    private void View_Click(object sender, EventArgs e)
    {
        int position = (int)((View)sender).Tag;
        OrderDto current = this[position];
    }
}

我已经确认过这些点:

  • ListView能正常加载并显示适配器提供的数据
  • 确实在OnCreate中调用了RegisterForContextMenu(LVOrders)
  • 上下文菜单的布局文件没有语法错误

但长按ListView条目就是完全没反应,OnCreateContextMenu的断点根本打不到。有没有大佬能帮我看看哪里出问题了?或者有没有其他需要注意的细节我漏掉了?

火山引擎 最新活动