天道酬勤,学无止境

软键盘的 View.OnKeyListener(View.OnKeyListener for soft keyboard)

问题

当按下/触摸某些特殊键时,我正在使用 View.OnKeyListener for EditText 执行某些操作。 这是代码的简化版本:

public class MyKeyListener implements View.OnKeyListener{
    // ...

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        if (event.getAction() == KeyEvent.ACTION_UP) {
            if (keyCode == KeyEvent.KEYCODE_DEL) {
                // do some processing
                return true;
            } else if (keyCode == KeyEvent.KEYCODE_0) {
                // do another processing
                return true;
            }
        }
    }
}

问题是 OnKeyListener,根据文档,只有在使用硬键盘时才能保证被调用。 而且,确实,我在一些不适用于软键盘的手机上对其进行了测试。 所以我想知道是否有类似于这个监听器的东西可以用于软键盘。

回答1

这不能保证,你不能。

您可以使用TextWatcher并将其附加到任何和所有 EditText。

或者,您创建自己的KeyboardView并强制用户使用该视图,然后您可以将预期的侦听器附加到它。 https://developer.android.com/guide/topics/text/creating-input-method.html?hl=ja#IMEUI

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 处理软键盘导航箭头(Handling Soft Keyboard Navigation Arrows)
    问题 在这里,我将 ViewPager 用于 Fragment,我使用自定义视图寻呼机来控制导航。 这是课堂, public class NonSwipeableViewPager extends ViewPager { public NonSwipeableViewPager(Context context) { super(context); setMyScroller(); } public NonSwipeableViewPager(Context context, AttributeSet attrs) { super(context, attrs); setMyScroller(); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { // Never allow swiping to switch between pages return false; } @Override public boolean onTouchEvent(MotionEvent event) { // Never allow swiping to switch between pages return false; } //down one is added for smooth scrolling
  • Android-处理EditText中的“ Enter”(Android - Handle “Enter” in an EditText)
    问题 我想知道是否有一种方法可以处理用户在输入EditText按Enter的问题,例如onSubmit HTML事件。 还想知道是否有一种方法可以操纵虚拟键盘,使“完成”按钮标记为其他名称(例如“转到”),并在单击时执行某种操作(再次类似于onSubmit)。 回答1 我想知道是否有一种方法可以处理在键入EditText时按Enter的用户,例如onSubmit HTML事件。 是的。 还想知道是否有一种方法可以操纵虚拟键盘,使“完成”按钮标记为其他名称(例如“转到”),并在单击时执行某种操作(再次类似于onSubmit)。 也可以 您将要查看android:imeActionId和android:imeOptions属性,以及setOnEditorActionListener()方法,全部位于TextView 。 要将“完成”按钮的文本更改为自定义字符串,请使用: mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER); 回答2 final EditText edittext = (EditText) findViewById(R.id.edittext); edittext.setOnKeyListener(new OnKeyListener() { public boolean onKey(View
  • 使用软键盘上的“ ENTER”键,而不是单击按钮(Use “ENTER” key on softkeyboard instead of clicking button)
    问题 您好,我已经搜索了EditText和search Button 。 输入搜索文本时,我想使用软键盘上的ENTER键而不是搜索Button来激活搜索功能。 预先感谢您的帮助。 回答1 您可以通过在EditText上设置OnKeyListener来实现。 这是我自己的代码中的示例。 我有一个名为addCourseText的EditText ,当单击Enter键或d-pad时,它将调用函数addCourseFromTextBox 。 addCourseText = (EditText) findViewById(R.id.clEtAddCourse); addCourseText.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_ENTER: addCourseFromTextBox(); return true; default: break; } } return false; } })
  • EditText OnKeyListener不起作用(EditText OnKeyListener not working)
    问题 我知道之前曾问过这个/类似的问题,但是给出的解决方案对我不起作用,所以我再次询问。 我尝试了该答案中给出的解决方案,但仍然无法在某些设备上调用我的OnKeyListener,特别是那些带有常规OS的设备。 当editText中没有字符时,我需要检测是否按下了软键盘的del键。 这是我的代码; EditText et = (EditText) findViewById(R.id.et); et.setOnKeyListener(new EditText.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { Log.d("OnKeyListener", keyCode + " character(code) to send"); return false; } }); 回答1 最终通过TextWatcher实现了此功能, TextWatcher解决了自己的问题。 主要障碍是,即使EditText没有字符,或者至少最终用户意识到那里没有字符,我也需要检测退格键。 第一件事无法实现,但是我后来做了。 以下是详细的解决方案。 首先,我总是在editText保留空格字符。 editText.addTextChangedListener(new TextWatcher(
  • onKeyListener在虚拟键盘上不起作用(onKeyListener not working on virtual keyboard)
    问题 我不明白为什么这段代码不起作用。 仅检测到退格键和返回键。 侦听器不会为其他任何键触发。 我的设备是Nexus One。 我试图覆盖活动的OnKeyDown方法,甚至更糟。 唯一检测到的按钮是硬件后退按钮。 我看到有关使用TextWatcher和onTextChanged的建议,尽管在某些情况下可能可行,但这并不是真正的解决方法。 例如,如果文本框为空,则不会检测用户是否按下BackSpace(Delete)按钮。 有什么想法吗? TextView txtInput = (TextView)findViewById(R.id.txtInput); txtInput.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { makeToast(keyCode + " key pressed"); return true; } }); 回答1 好的。 我终于弄清楚了如何做自己想做的事,为此我在Android上并不感到骄傲。 我正在编写服务器/客户端应用程序,在客户端上我必须打开SoftKeyboard并发送按下的键(字符和DEL键)...每次按下该键,该字符都会发送到服务器。 如果按了DEL,我将向服务器发送序列
  • View.OnKeyListener for soft keyboard
    I am using the View.OnKeyListener for EditText to do something when some special keys are pressed/touched. Here is a shorthened version of the code: public class MyKeyListener implements View.OnKeyListener{ // ... @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP) { if (keyCode == KeyEvent.KEYCODE_DEL) { // do some processing return true; } else if (keyCode == KeyEvent.KEYCODE_0) { // do another processing return true; } } } } The problem is that the OnKeyListener, according to the documentation, is only guaranteed to be called
  • 如何覆盖 Android中虚拟键盘的按键行为(How to override the <ENTER> key behaviour of the virtual keyboard in Android)
    问题 我想覆盖虚拟键盘的ENTER键的行为,以便: 当屏幕上有更多字段时,它“标签”到下一个字段当它是屏幕的最后一个字段时,它执行屏幕的默认动作 我一直在玩 IME 选项和标签,但就是没有得到我想要的。 有人有什么建议吗? 回答1 在另一个论坛的帮助下,我找到了方法。 为了使其可重用,我创建了自己的超级对话框类,其中包含 2 个OnKeyListener对象和一个抽象提交方法: public abstract class MyAbstractDialog extends Dialog { /** * OnKeyListener that puts the focus down when the ENTER key is pressed */ protected View.OnKeyListener onEnterFocusDown = new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { v.requestFocus(View.FOCUS_DOWN); return
  • Android EditText delete(backspace)键事件(Android EditText delete(backspace) key event)
    问题 如何检测editText的删除(退格)键事件? 我尝试使用TextWatcher,但是当editText为空时,当我按Delete键时,什么也没有发生。 我想检测一个删除键,即使它没有文本,也可以编辑文本。 回答1 注意: onKeyListener不适用于软键盘。 您可以为editText设置OnKeyListener ,以便可以检测到任何按键编辑:我们正在检查KeyEvent.KEYCODE_BACK的backspace ,这是一个常见错误,但实际上它是KeyEvent.KEYCODE_DEL (真的,这个名称很令人困惑!) editText.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //You can identify which key pressed buy checking keyCode value with KeyEvent.KEYCODE_ if(keyCode == KeyEvent.KEYCODE_DEL) { //this is for backspace } return false; } }); 回答2 自您询问以来已经有一段时间了,但我只是遇到了同样的问题。
  • 在 SearchView 中处理物理键盘的 Enter 键(Handling physical keyboard's Enter key in SearchView)
    问题 我在我的应用程序中实现了一个 SearchView,当我在使用软键盘(使用 QueryTextListener)时点击搜索按钮时它可以正常工作: viewHolder.mTextSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { new SearchForEquipmentTask(false, viewHolder.mTextSearch.getQuery().toString()).execute(); return true; } @Override public boolean onQueryTextChange(String newText) { //Log.d(TAG, "Query: " + newText); return false; } }); 现在我打算使用物理键盘让我的用户能够使用该应用程序,但我不知道如何从物理键盘触发搜索事件(onQueryTextChange 没有被该键调用)。 当我在 Android Studio 中运行模拟器时会发生同样的事情。 我试过了: viewHolder.mTextSearch.setOnKeyListener(new
  • Android:当焦点位于EditText上时自动显示软键盘(Android: show soft keyboard automatically when focus is on an EditText)
    问题 我正在使用AlertDialog显示一个输入框。 当我调用AlertDialog.show() ,对话框本身内的EditText会自动聚焦,但不会自动显示软键盘。 显示对话框时,如何使软键盘自动显示? (并且没有物理/硬件键盘)。 类似于当我按下“搜索”按钮以调用全局搜索时,将自动显示软键盘。 回答1 您可以在AlertDialog的EditText上创建焦点侦听AlertDialog ,然后获取AlertDialog的Window 。 从那里,您可以通过调用setSoftInputMode显示软键盘。 final AlertDialog dialog = ...; editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } }); 回答2 显示键盘使用: InputMethodManager imm = (InputMethodManager
  • Android-无法捕获软件中的退格键/删除键。 键盘(Android - cannot capture backspace/delete press in soft. keyboard)
    问题 我重写视图(openGL表面视图)的onKeyDown方法以捕获所有按键。 问题是在多个设备上没有捕获KEYCODE_DEL。 我尝试将onKeyListener添加到视图中,并且捕获了除Backspace键之外的所有内容。 必须有一种方法来监听此按键事件,但是如何? 回答1 2014年11月12日更新:已将修复范围更改为不限于<API级别19,因为在第三方键盘上,该bug仍超过19。 2014年1月9日更新:我已经设计出一种带有代码的方法来解决所有Google键盘(LatinIME)KEYCODE_DEL问题,尤其是问题42904和62306。 Turix的答案的增强功能已在获得许可的情况下并入我自己的代码中。 Turix的改进消除了将垃圾字符注入Editable缓冲区的麻烦,而改为寻找一种增量方式来确保该缓冲区中始终只有一个字符。 我在一个已部署的应用程序中使用了与此类似的代码,我们欢迎您对其进行测试: https://play.google.com/store/apps/details?id=com.goalstate.WordGames.FullBoard.trialsuite] 介绍: 就这两个错误而言,以下介绍的变通办法旨在适用于过去和将来的所有版本的Google Keyboard。 这种解决方法并不需要一个应用程序仍然卡住定位API级别15或以下
  • 检测来自软件或硬件键盘的输入(Detect input from software or hardware keyboard)
    问题 我正在使用必须使用RFID标签阅读器的Android应用程序中工作。 我将此读取器用作通过OTG线连接到我的microUSB中的额外设备。 Android正在将该设备检测为输入键盘。 我想知道是否可以通过编程方式检测用户何时使用此阅读器进行输入。 因此,基本上,我必须区分来自软键盘或此阅读器的输入。 我进行了很多搜索,但找不到解决方案,将不胜感激。 非常感谢你。 回答1 yourEditText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { return false; } }); 这将检测您的editText是否正在使用硬件键盘进行编辑。 如此处所述,这仅对硬件键盘有用,因此在您的情况下,如果未调用此接口,则意味着editText输入应来自软件键盘。 回答2 在kotlin中,我正在使用KeyEvent来确定输入是否来自外部RFID标签读取器。 当我不想允许将值插入RFID阅读器的edit_text时,我将使用以下方法: edit_text.setOnKeyListener { _, _, event -> !event.device.isVirtual } 另请参阅文档,并尝试将其用于您的问题
  • 强制 EditText 在以下情况下失去焦点:按下某些键盘键以及当用户单击活动中的其他内容时(Force EditText to lose focus when: some keyboard keys are pressed and when user clicks on something else in the activity)
    问题 我知道这个问题以前曾以多种不同的方式被问过,但即使我查看了许多其他关于 EditText 焦点的相关问题,我也没有找到我的解决方案。 这是我想要实现的目标: 当用户完成编辑 EditText 时,我希望它失去焦点。 当用户在 EditText 之外点击时,我希望这样的 EditText 失去焦点。 每当软键盘隐藏或隐藏时,我都希望 EditText 失去焦点。 每当用户在软键盘中按 ENTER 或 BACK ARROW 时,应清除 EditText 焦点 这是我目前拥有的: 我在一个活动中有两个 EditText,为了简单起见,我将它们称为 EditText_1 和 EditText_2,以便我们知道我在谈论哪个 EditText。 当用户启动活动时,EditText_1 将没有焦点,闪烁的光标和软键盘将被隐藏。 我已经解决了这个问题; android:focusableInTouchMode="true" 和android:focusable="true" 在第 1 部分中的先前修复之后,当我启动活动并单击任何 EditText 时,它将获得焦点,但是,当我完成编辑这样单击的 EditText 并且软键盘隐藏时,EditText 不会失去焦点,光标将还是会眨眼。 另一个例子发生在我编辑 EditText 并单击 editText 之外的任何其他按钮时,它不会强制
  • Android 输入键监听器(Android enter key listener)
    问题 有人可以帮助我使用软键盘输入键侦听器吗? 我需要一个像按钮侦听器这样的输入键侦听器,里面会有一些像这样的 editext 侦听器 enterkey.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(editext1.getText().toString().equalsIgnoreCase("test1")) { button3.performClick(); } if(editext1.getText().toString().equalsIgnoreCase("test2")) { button4.performClick(); } } ); 我还需要像下面这样的东西,这是正确的吗? if(editext1.getText().toString().equals.null)) { testwrong.setText("Wrong"); 感谢所有可以提供帮助的人 我现在已尝试使用此代码,但在按 Enter 键时一直得到空值? 任何人都可以提出避免这种情况的解决方案吗? editext.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int
  • Cordova 插件 - Android 键盘事件(Cordova Plugin - Keyboard Events Android)
    问题 我正在努力为 Android 上的 Cordova 创建一个插件,该插件可以拦截硬件键盘事件,并将它们提供给 Javascript 侦听器。 我之前创建了其他插件,但我正在努力解决这个问题,因为我开始时在 Java 方面并不是特别强。 下面的代码片段中的所有内容都可以正常编译,但在 Javascript 方面没有任何内容。 感谢您对此的任何和所有帮助! 更新:经过更多研究后,似乎默认情况下在更高版本的 Android 中禁用了关键事件。 这是由于一些 BS 借口使用这么多不同的输入设备和方法来获得更好的用户体验。 如果您从头开始构建应用程序,此处的帖子似乎提供了解决方案,但不适用于 Cordova。 这篇文章有一些适用于 Cordova 的东西,但它似乎对插件有侵入性。 我想覆盖 CordovaWebView 中的一些方法,但我不想重新初始化它。 这是 Javascript 中的常见做法; 有谁知道如何在 Java for Android 中做到这一点? 键盘插件.java package com.otb.cordova.keyboard; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; import org.apache.cordova
  • 在Fragment中实现onKeyPreIme(int keyCode,KeyEvent事件)(Implementing onKeyPreIme(int keyCode, KeyEvent event) in Fragment)
    问题 我无法弄清楚如何在Fragment实现onKeyPreIme(int keyCode, KeyEvent event) 。 @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { // do your stuff return false; } return super.dispatchKeyEvent(event); } 我尝试了很多,但没有任何效果。 另外,我在Google或Stack Overflow上找不到任何内容。 我想在按下返回键且软键盘启动时执行一项操作。 在我的EditText上设置onKeyListener无效,因为在软键盘启动时不会调用KeyEvent.KEYCODE_BACK 。 我感谢任何帮助和源代码。 回答1 通过子类化与键盘输入相关的EditText视图,我能够实现onKeyPreIme。 目的是创建一个自定义锁定屏幕,使用户必须输入密码或退出应用程序。 当用户点击“向下键盘”按钮时,键盘不会消失。 确保为子类EditText创建一个单独的.java文件。 此外,请确保在下面的代码中使用构造函数
  • onKeyListener not working on virtual keyboard
    I don't understand why this piece of code is not working. Only backspace and return key are detected. Listener doesn't fire for any other key. My device is Nexus One. I tried to override activity's OnKeyDown method and that's even worse. The only detected button was hardware back button. I am seeing around a suggestion to use TextWatcher and onTextChanged, while that might work in some cases, it's not a real work around. For example, if textbox is empty, you won't detect if user press BackSpace(Delete) button. So any ideas? TextView txtInput = (TextView)findViewById(R.id.txtInput); txtInput
  • 在第一个框中输入字符后,焦点转到下一个框(focus goto on next box after enter character in first box)
    问题 我必须实现一个应用程序,在其中我为输入的 PIN 号码和手机号码设置了小的edittext 。 每个编辑文本一次包含 1 个字符。 现在,当我运行这个应用程序时,我发现对于每个框,我需要将焦点放在每个edittext 。 所以在这种情况下,是否可以在第一个字符输入后在下一个编辑文本中设置焦点,然后在第二个字符输入后转到第三个。 所以请帮我解决这个问题 这是布局图像。 回答1 1. implements TextWatcher on EditTexts 然后当你得到 Edittext 的文本长度是 1 。 2. Change focus on other EditText using 在另一个 EditText 上调用requestFocus() .. 代码:(此代码仅供您理解,根据您的情况和您的需要可能会有所不同) public class LoginActivity extends Activity implements TextWatcher { . . . editTextUName = (EditText) findViewById(R.id.edttextusername); editTextUName.addTextChangedListener(this); editTextPwd = (EditText) findViewById(R.id
  • setOnKeyListener没有响应(setOnKeyListener not responding)
    问题 我是Android的新手,正在研究一本书中的待办事项清单示例。 我有一个活动,在其下方显示一个EditText和一个ListView。 有一个onKey事件,该事件应将EditText中的文本添加到ListView并清除EditText。 但是,当我按键盘上的Enter键时,所发生的只是将新行添加到EditText中,而没有任何内容添加到ListView中。 onCreate代码为: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_to_do_list); // Get UI references ListView myListView = (ListView)findViewById(R.id.myListView); final EditText myEditText = (EditText)findViewById(R.id.myEditText); myEditText.setText("test"); // Create ArrayList to store To Do items final ArrayList<String> toDoItems =
  • android EditText ,keyboard textWatcher problem
    I am working on a android app and I have an EditText where user can input numbers. I want to format the number using different currency formats (say ##,##,###) and I want to do it on the fly, ie when user enter each digit(not when enter is pressed). I googled around, and came across TextWatcher which I first found promising, but it turned out to be an absolute pain. I am debugging my code on a HTC Desire phone which only has a soft keyboard. Now I want to get a callback when user press numbers (0 to 9) , del (backspace) key and enter key. From my testing I found these (atleast on my phone) 1)