如何为 MvxItemTemplate 创建视图的操作侦听器

2023-12-13

我有一个包含 MvxListView 和表单的视图。我可以在视图代码中使用以下代码隐藏软键盘(因为这是纯粹的视图问题)

var editText = FindViewById<EditText>(Resource.Id.newCheckbookName);
editText.EditorAction += (object sender, TextView.EditorActionEventArgs e) =>
    {
        if (e.ActionId == ImeAction.Done)
        {
            InputMethodManager inputMgr = GetSystemService(InputMethodService) as InputMethodManager;
            inputMgr.HideSoftInputFromWindow(CurrentFocus.WindowToken, 0);
        }
        return;
   };

在我的项目模板中,我有一个其他文本编辑器,并且希望具有相同的行为。但是我可以在哪里添加我的代码,因为我没有 MwxItemTemplate 的任何视图代码?


我认为执行此操作的简单方法是在列表项中使用自定义“视图”。

Note:这里的“视图”指的是 Android 视图 - 不是模型-视图-视图模型视图 - 抱歉命名混乱!

创建自定义视图很容易......

只需创建一个自定义视图 - 例如

namespace Angevelle.App1.UI.Droid.Controls
{
    public class MyText : EditText
    {
        public MyText(Context context, IAttributeSet attrs)
            : base(context, attrs)
        {
            this.EditorAction += OnEditorAction;
        }

        private void OnEditorAction(object sender, EditorActionEventArgs editorActionEventArgs)
        {
            if (editorActionEventArgs.ActionId == ImeAction.Done)
            {
                // this code not tested - but something like this should work
                var imm = (InputMethodManager)Context.GetSystemService(Context.InputMethodService);
                imm.HideSoftInputFromWindow(WindowToken, 0);
            }
        }
    }
}

然后您可以在 AXML 中使用该视图,就像使用 Android 或 Mvx 视图一样:

<angevelle.app1.ui.droid.controls.MyText
         android:layout_height=....
     />

如果您正在寻找angevelle.app1.ui.droid.controls太冗长了,那么您可以在 setup.cs 中使用缩写来缩短它:

    protected override IDictionary<string, string> ViewNamespaceAbbreviations
    {
        get
        {
            var abbreviations = base.ViewNamespaceAbbreviations;
            abbreviations["Abv"] = "angevelle.app1.ui.droid.controls";
            return abbreviations;
        }
    }

那么你可以使用:

<Abv.MyText
         android:layout_height=....
     />

另一种方法可能是以某种方式自定义列表......

如果您确实需要完全自定义列表视图及其适配器,那么可以使用相同类型的技术轻松完成 - 从 UI 项目中的 MvxBindableListView 继承:

public class MyListView : MvxBindableListView
{
        public MyListView(Context context, IAttributeSet attrs);
            : base(context, attrs, new MyListAdapter(context))
        {
        }
}

其中 MyListAdapter 覆盖视图创建:

public class MyListAdapter : MvxBindableListAdapter
{
    public MyListAdapter(Context context)
        : base(context)
    {
    }

    // put your custom Adapter code here... e.g.:
    protected override MvxBindableListItemView CreateBindableView(object source, int templateId)
    {
        return new MySpecialListItemView(_context, _bindingActivity, templateId, source);
    }
}

其中 MySpecialListItemView 继承自 MvxBindableListItemView 但添加了您自己的自定义功能。

使用这种方法,您的列表将从:

<Mvx.MvxBindableListView
      ....
     />

to:

<Abv.MyListView
      ....
     />

有关自定义视图的更多示例,请查看 GitHub - 例如在一些日历、ColorPicker、ActionBar 项目中https://github.com/Cheesebaron

不要指望您的自定义控件能够在 xamarin 设计器中呈现(好吧,还没有......)


最后两个注意事项...

  1. 要重用代码......你可能想把它HideSoftInputFromWindow扩展方法中的功能以某种方式这样你就可以调用anyEditText.HideOnDone()

  2. 在 Views/UIViews 上使用 Monodroid/monotouch 事件时要小心 - 这些事件往往使用本机委托/侦听器 - 因此有时您会发现附加某些内容来订阅一个事件可能会取消附加其他内容!一般来说,只要不将 C# 事件订阅与本机侦听器/委托处理程序同时混合和匹配,就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 MvxItemTemplate 创建视图的操作侦听器 的相关文章

  • 找不到 Android 支持库和媒体路由器 .jar 文件

    我对 Xamarin 完全陌生 我想将地图添加到 Xamarin Android 中的默认 hello world 我已经按照指南一步步准备了清单 还通过 sdk 管理器下载了支持库 但出现错误 要求我安装 SL 和 SL 媒体路由器 这里
  • 如何在 Xamarin.Android 的 AXML 上启用智能感知?

    由于这个很棒的工具对所有人免费 我尝试了它 并且我喜欢它 尤其是 Visual Studio Android 模拟器 但是 我遇到了一个问题 因为 Visual Studio 智能感知根本不适用于 axml 文件 我尝试了这篇文章 http
  • Xamarin.Android 应用程序仅在干净编译时找到启动器活动

    我有一个Xamarin Android标记为 MainLauncher 的活动称为 Login 当我第一次按 F5 时 应用程序在模拟器中正常启动 然后我停下来 进行一些代码更改 再次按 F5 我可以看到应用程序在模拟器中启动 当我收到以下
  • 如何使用带有 ListView 和自定义适配器的选择器来指示所选项目

    我有一个具有 ListView 的活动 并且我创建了一个自定义适配器 基于BaseAdapter 自定义适配器的 GetView 方法使用自定义布局 view context LayoutInflater Inflate Resource
  • MVVMCross 在 MvxBindableListView 中更改 ViewModel

    我的 Android 应用程序出现了一些小问题 我不知道如何使用 MVVM Cross 来解决它 这是我的模型 public class Article string Label get set string Remark get set
  • 如何单击 TableLayout 中的特定 TableRow

    我制作了自己的复合控件 该控件使用 TableLayout 显示数据网格 并根据绑定到它的对象数组以编程方式在循环内添加 Tablerows 现在我想选择具有特定数据的特定行 以便由一个方法 那么我如何选择检索其数据的特定行来委托方法呢 你
  • Xamarin Forms WebView 打开外部链接

    我的应用程序中有一个网络视图 当单击外部链接 在普通浏览器中在新选项卡中打开 时 我无法返回我的网站 当打开一个新标签时 有可能像 Gmail 一样关闭该标签的菜单吗 目的是 每当单击链接时 用户都可以选择使用哪个选项来查看内容 例如单击链
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • MvvmCross 中的异步初始化和属性已更改

    我在视图模型中有一些来自 Init 的异步调用 问题是有时异步调用会在 OnCreate 之前返回 并且 UI 中的属性不会更新 当我们必须初始化异步数据时 是否有适合这种情况的适当的异步 等待模型 伪代码 ViewModel public
  • 使用 SkiaSharp 在 Xamarin 中加载 SVG 文件

    从版本 1 55 0 开始 SkiaSharp 支持读取 SVG 文件 该软件包已于几天前发布 2016 年 11 月 10 日 但我找不到足够的有关如何使用它的文档 需要以下包 SkiaSharp 1 55 0 SkiaSharp 视图和
  • 将字节数组保存为 Android 设备文件夹中的 jpg 文件

    我正在尝试将图像保存在 Android 设备的文件夹中 我使用的代码如下 var newFolder AndroidEnvironment GetExternalStoragePublicDirectory AndroidEnvironme
  • 没有 Xamarin.Forms 的 Xamarin BeginInvokeOnMainThread

    抱歉 我确信这将是一个非常愚蠢的问题 我在 Xamarin 应用程序中使用 Android UI 而不是 Xamarin Forms 作为表示层 但我想使用 Activity RunOnUIThread 来自 Android 所有 Xama
  • 如何将屏幕截图转换为二进制?

    我正在开发一个 Xamarin Forms 项目 在该项目中我想将我的屏幕截图 PNG 转换为二进制并将其上传到服务器 现在服务器部分需要一个API 我将由已经完成它的人交给我 我只需要实现它 在我完成这个任务之后 到目前为止 我已经成功地
  • 带旋转器的时间选择器?

    我正在尝试构建一个 TimePickerDialog 但不幸的是出现的时间选择器使用起来非常麻烦 有什么方法可以构建一个像 Android 使用的旧时间选择器一样的时间选择器 如下所示 我的代码如下 ButtonTime Click del
  • MvvmCross:如何将 Android 上下文传递给 MvxCommand?

    我创建了一个服务接口 public interface IMessageDialogService void ShowDialog object context string title string message string butt
  • Android 模拟器无法与 Xamarin/Visual Studio Mac 配合使用

    你好 我真的很难让 Android 模拟器在我的 Mac 上运行 我需要采取哪些步骤才能使其正常工作 我在 MacOS Catalina 上安装了 Visual Studio 2019 这是一个新的空白 Xamarin Forms 项目 我
  • 如何在 xamarin.android 中创建新的密钥库?

    我正在尝试发布 xamarin android 应用程序 我正在使用 Visual Studio 和 Xamarin Android 6 所以我遵循this https developer xamarin com guides androi
  • 错误:Xamarin.Forms 目标已导入多次

    a few hours ago my solution just builds success but after that it has error Xamarin Forms targets have been imported mul

随机推荐