Android:密钥侦听器不工作

Android:密钥侦听器不工作,android,xamarin,xamarin.android,onkeylistener,Android,Xamarin,Xamarin.android,Onkeylistener,在OnCreate fragment方法中,我从布局中获取EditText并调用SetOnKeyListener: Aaa = view.FindViewById<EditText>(Resource.Id.aaaText); Aaa.SetOnKeyListener(new LocationKeyListener()); Aaa=view.findviewbyd(Resource.Id.aaaText); Aaa.SetOnKeyListener(新位置KeyListener()

在OnCreate fragment方法中,我从布局中获取EditText并调用SetOnKeyListener:

Aaa = view.FindViewById<EditText>(Resource.Id.aaaText);
Aaa.SetOnKeyListener(new LocationKeyListener());
Aaa=view.findviewbyd(Resource.Id.aaaText);
Aaa.SetOnKeyListener(新位置KeyListener());
布局声明:

<EditText 
            android:id="@+id/aaaText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:imeOptions="actionNext"
            style="@style/LocationEditTextStyle"
            android:hint="AAA"
            app:MvxBind="Text Aaa.Value"/>
<style name="LoginEditTextTheme" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/accentColor</item>
        <item name="colorControlActivated">@color/secondaryTextColor</item>
    </style>


    <style name="LocationEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:textAllCaps">true</item>
        <item name="android:inputType">textCapCharacters</item>
        <item name="android:maxLength">3</item>
        <item name="android:gravity">center_horizontal</item>
        <item name="android:textSize">@dimen/location_text_size</item>
        <item name="android:theme">@style/LocationEditTextTheme</item>
    </style>

编辑文本样式:

<EditText 
            android:id="@+id/aaaText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:imeOptions="actionNext"
            style="@style/LocationEditTextStyle"
            android:hint="AAA"
            app:MvxBind="Text Aaa.Value"/>
<style name="LoginEditTextTheme" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/accentColor</item>
        <item name="colorControlActivated">@color/secondaryTextColor</item>
    </style>


    <style name="LocationEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:textAllCaps">true</item>
        <item name="android:inputType">textCapCharacters</item>
        <item name="android:maxLength">3</item>
        <item name="android:gravity">center_horizontal</item>
        <item name="android:textSize">@dimen/location_text_size</item>
        <item name="android:theme">@style/LocationEditTextTheme</item>
    </style>

@颜色/强调色
@颜色/次要文本颜色
真的
字母大小
3.
水平中心
@尺寸/位置\文字\尺寸
@样式/位置EditTextTheme
LocationKeyListener:

<EditText 
            android:id="@+id/aaaText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:imeOptions="actionNext"
            style="@style/LocationEditTextStyle"
            android:hint="AAA"
            app:MvxBind="Text Aaa.Value"/>
<style name="LoginEditTextTheme" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/accentColor</item>
        <item name="colorControlActivated">@color/secondaryTextColor</item>
    </style>


    <style name="LocationEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:textAllCaps">true</item>
        <item name="android:inputType">textCapCharacters</item>
        <item name="android:maxLength">3</item>
        <item name="android:gravity">center_horizontal</item>
        <item name="android:textSize">@dimen/location_text_size</item>
        <item name="android:theme">@style/LocationEditTextTheme</item>
    </style>

问题是当我在EditText中编写时,LocationKeyListener.OnKey方法没有被调用

更新

编辑文本的我的片段:

public abstract class BaseActionFragment<T> : BaseFragment<T> where T : BaseViewModel
    {
        protected EditText Aaa, Bbb, Ccc, Ddd, Eee;
        protected EditText test;


        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = base.OnCreateView(inflater, container, savedInstanceState);

            Aaa = view.FindViewById<EditText>(Resource.Id.aaaText);
            Bbb = view.FindViewById<EditText>(Resource.Id.bbbText);
            Ccc = view.FindViewById<EditText>(Resource.Id.cccText);
            Ddd = view.FindViewById<EditText>(Resource.Id.dddText);
            Eee = view.FindViewById<EditText>(Resource.Id.eeeText);

            Aaa.AddLocationTextWatcher(Aaa, Bbb);
            Bbb.AddLocationTextWatcher(Aaa, Ccc);
            Ccc.AddLocationTextWatcher(Bbb, Ddd);
            Ddd.AddLocationTextWatcher(Ccc, Eee);
            Eee.AddLocationTextWatcher(Ddd, Aaa);

            test = view.FindViewById<EditText>(Resource.Id.testText);

            test.SetOnKeyListener(new LocationKeyListener());
            test.KeyPress += (sender, args) =>
            {

            };

            return view;
        }
    }
公共抽象类BaseActionFragment:BaseFragment,其中T:BaseViewModel
{
受保护文本Aaa、Bbb、Ccc、Ddd、Eee;
保护文本测试;
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
视图=base.OnCreateView(充气机、容器、savedInstanceState);
Aaa=view.findviewbyd(Resource.Id.aaaText);
Bbb=view.findviewbyd(Resource.Id.bbbText);
Ccc=view.findviewbyd(Resource.Id.cccText);
Ddd=view.findviewbyd(Resource.Id.dddText);
Eee=view.findviewbyd(Resource.Id.eeeText);
Aaa.AddLocationTextWatcher(Aaa,Bbb);
Bbb.AddLocationTextWatcher(Aaa、Ccc);
Ccc.AddLocationTextWatcher(Bbb,Ddd);
Ddd.AddLocationTextWatcher(Ccc,Eee);
Eee.AddLocationTextWatcher(Ddd,Aaa);
test=view.findviewbyd(Resource.Id.testText);
test.SetOnKeyListener(新位置KeyListener());
test.KeyPress+=(发送方,参数)=>
{
};
返回视图;
}
}
这是我的主容器视图

 [Activity(
        Theme = "@style/AppTheme")]
    public class MainContainerActivity : BaseActivity<MainContainerViewModel>, IDrawerActivity
    {
        protected override int ActivityLayoutId => Resource.Layout.activity_main_container;

        public DrawerLayout DrawerLayout { get; private set; }
        protected MvxActionBarDrawerToggle DrawerToggle { get; private set; }

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            DrawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);

            SetupDrawerLayout();
            DrawerToggle.SyncState();

            if (bundle == null)
                ViewModel.ShowMenuCommand.Execute();
        }

        private void SetupDrawerLayout()
        {
            SupportActionBar?.SetDisplayHomeAsUpEnabled(true);

            DrawerToggle = new MvxActionBarDrawerToggle(
                this,                           // host Activity
                DrawerLayout,                   // DrawerLayout object
                Toolbar,                        // nav drawer icon to replace 'Up' caret
                Resource.String.drawer_open,    // "open drawer" description
                Resource.String.drawer_close    // "close drawer" description
            );

            DrawerToggle.DrawerOpened += (sender, e) => HideSoftKeyboard();
            DrawerLayout.AddDrawerListener(DrawerToggle);
        }

        public override void OnBackPressed()
        {
            if (DrawerLayout != null && DrawerLayout.IsDrawerOpen(GravityCompat.Start))
                DrawerLayout.CloseDrawers();
            else
                base.OnBackPressed();
        }

        public override void OnConfigurationChanged(Configuration newConfig)
        {
            base.OnConfigurationChanged(newConfig);
            DrawerToggle.OnConfigurationChanged(newConfig);
        }


        public void HideSoftKeyboard()
        {
            if (CurrentFocus != null)
            {
                var inputMethodManager = (InputMethodManager)GetSystemService(InputMethodService);
                inputMethodManager.HideSoftInputFromWindow(CurrentFocus.WindowToken, 0);

                CurrentFocus.ClearFocus();
            }
        }
    }
[活动](
Theme=“@style/AppTheme”)]
公共类MainContainerActivity:BaseActivity、IDraEventivity
{
受保护的覆盖int-ActivityLayoutId=>Resource.Layout.activity\u主容器;
公共抽屉布局抽屉布局{get;private set;}
受保护的MvxActionBarDrawerToggle抽屉切换{get;private set;}
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
抽屉布局=FindViewById(Resource.Id.drawer\u布局);
SetupDrawerLayout();
DrawerToggle.SyncState();
if(bundle==null)
ViewModel.ShowMenuCommand.Execute();
}
专用void SetupDrawerLayout()
{
SupportActionBar?.SetDisplayHomeAsUpEnabled(真);
抽屉切换=新的MvxActionBarDrawerToggle(
此,//主机活动
抽屉布局,//抽屉布局对象
工具栏,//导航抽屉图标以替换“Up”插入符号
Resource.String.drawer\u open,/“open drawer”说明
Resource.String.drawer\u close/“close drawer”说明
);
抽屉切换。抽屉连接+=(发送方,e)=>隐藏键盘();
抽屉布局。添加抽屉链接(抽屉切换);
}
public override void OnBackPressed()
{
if(DrawerLayout!=null&&DrawerLayout.IsDrawerOpen(GravityCompat.Start))
抽屉布局;
其他的
base.OnBackPressed();
}
公共覆盖无效OnConfigurationChanged(配置newConfig)
{
base.OnConfigurationChanged(newConfig);
DrawerToggle.OnConfigurationChanged(newConfig);
}
public void HideSoftKeyboard()
{
if(CurrentFocus!=null)
{
var inputMethodManager=(inputMethodManager)GetSystemService(InputMethodService);
inputMethodManager.HideSoftInputFromWindow(CurrentFocus.WindowToken,0);
CurrentFocus.ClearFocus();
}
}
}

也许这是因为所有这些都在片段中,虽然这是一个老话题,但我遇到了相同的问题,请注意View.IOnKeyListener不支持软键盘(虚拟键盘)键输入。只有硬件键盘输入通过OnKey事件执行

根据您的使用情况,如果您希望在按下任何软键盘按钮(如Keycode.NavigateNext按钮)时收到通知,请使用EditorAction事件。在Xamarin.表单中,例如定义自定义条目呈现器,在OnElementChanged事件中,通过以下方式侦听事件:

this.EditText.EditorAction += EditTextOnEditorAction;
而不是处理您感兴趣的任何关键操作:

private void EditTextOnEditorAction(object sender, TextView.EditorActionEventArgs e)
{
    if (e.ActionId == ImeAction.Next)
    {
        var formsNextSearch = FocusSearchNextElement();
        if (formsNextSearch != null)
        {
            EditText.ClearFocus();                   
        }
    }
}

我试过你的sampe(不带款式),效果不错。也许只是删除debug和obj文件夹并重建…它在操作系统(Windows)上运行的模拟器上工作,但是当我在真实的手机上调试时,它就不工作了。你是在模拟器上还是在真手机上调试的?@NikitaGoncharuk如果你在
EditText
上测试
LocationKeyListener
而不测试
app:MvxBind
,会怎么样?@foxanna否,删除
app:MvxBind
不会帮助我测试你的代码(使用MvvmCross),无法重现这个问题。你能发布更详细的代码吗?或者分享一个基本的演示,通过在线回购重现问题