Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何在软输入/键盘上捕捉长按事件?_Android_Android Edittext_Android Input Method - Fatal编程技术网

Android:如何在软输入/键盘上捕捉长按事件?

Android:如何在软输入/键盘上捕捉长按事件?,android,android-edittext,android-input-method,Android,Android Edittext,Android Input Method,问题的简短版本:在Android中,如何在软输入/键盘上捕捉长按事件 长版本: 在Android应用程序中,我们有一个多行EditText,我们希望有这样的行为: 1.默认情况下,它显示一个完成按钮,点击它,软输入/键盘将关闭。 2.如果用户长按“完成”按钮,其行为将更改为“进入”按钮,并且在编辑文本中将有一个新行 对于需求#1,我在这里使用了解决方案: 对于需求#2,我遇到的阻碍问题是,如何捕捉长时间的新闻事件。 我设置了onEditorActionListener,但捕获的事件为空: 我搜索

问题的简短版本:在Android中,如何在软输入/键盘上捕捉长按事件

长版本: 在Android应用程序中,我们有一个多行EditText,我们希望有这样的行为: 1.默认情况下,它显示一个完成按钮,点击它,软输入/键盘将关闭。 2.如果用户长按“完成”按钮,其行为将更改为“进入”按钮,并且在编辑文本中将有一个新行

对于需求#1,我在这里使用了解决方案:

对于需求#2,我遇到的阻碍问题是,如何捕捉长时间的新闻事件。 我设置了onEditorActionListener,但捕获的事件为空: 我搜索了文档,长按相关方法用于硬键盘:,android.view.KeyEvent),我找不到用于软输入/键盘的方法


感谢您研究这个问题。

我自己找不到这个答案,所以我手动编写了解决方案。我在
KeyboardView.OnKeyboardActionListener
onPress()和
onRelease()事件上使用了计时器。这是重要的代码。为了简洁起见,许多尝试/捕获被遗漏了。在英语中,当按下一个键时,我启动一个计时器,该计时器的等待时间与长点击事件通常等待的时间相同(
ViewConfiguration.getLongPressTimeout()
),然后在原始线程上执行长点击事件。随后的按键释放和按键可取消任何活动计时器

public class MyIME
    extends InputMethodService
    implements KeyboardView.OnKeyboardActionListener {
    :
    :
    private Timer timerLongPress  = null;
    :
    :

    @Override
    public void onCreate() {
        super.onCreate();
        :
        :
        timerLongPress = new Timer();
        :
        :
    }

    @Override
    public void onRelease(final int primaryCode) {
        :
        :
        timerLongPress.cancel();
        :
        :
    }

    @Override
    public void onPress(final int primaryCode) {
        :
        :
        timerLongPress.cancel();
        :
        :
        timerLongPress = new Timer();

        timerLongPress.schedule(new TimerTask() {

            @Override
            public void run() {

                try {

                    Handler uiHandler = new Handler(Looper.getMainLooper());

                    Runnable runnable = new Runnable() {

                        @Override
                        public void run() {

                            try {

                                MyIME.this.onKeyLongPress(primaryCode);

                            } catch (Exception e) {
                                Log.e(MyIME.class.getSimpleName(), "uiHandler.run: " + e.getMessage(), e);
                            }

                        }
                    };

                    uiHandler.post(runnable);

                } catch (Exception e) {
                    Log.e(MyIME.class.getSimpleName(), "Timer.run: " + e.getMessage(), e);
                }
            }

        }, ViewConfiguration.getLongPressTimeout());
        :
        :
    }

    public void onKeyLongPress(int keyCode) {
        // Process long-click here
    }

通过扩展KeyboardView类创建自定义键盘视图类。重写onLongPress()方法

是否尝试添加
doneButton.setOnLongClickListener(新的OnLongClickListener(){…})我不确定您的解决方案是否能按预期工作。根据文档,onPress()在onKey()之前调用一次,onRelease在onKey()之后调用。这意味着,不管发生什么,onKey都将被执行。如果您的解决方案在长按时得到实施,则按键的正常行为和长按行为都将被执行。我可以想象的另一个问题是“我在哪里设置以及如何检索长按按键代码?”。这将特别麻烦,因为xml中的结构不提供此类场景。有什么意见吗?这似乎有效!唯一的问题是,它不会取消按键在短按时所做的操作,这是在按键释放时发送的。通过在重写KeyboardView的类中返回true修复了此问题。