安卓:如何在软输入/键盘上捕获长按事件



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

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

对于要求#1,我在这里使用了解决方案:https://stackoverflow.com/a/12570003/4225326

对于要求#2,我遇到的阻止问题是,如何捕获长按事件。我设置了 onEditorActionListener,但捕获的事件为 null:http://developer.android.com/reference/android/widget/TextView.OnEditorActionListener.html我搜索了文档,长按相关方法是硬键盘:http://developer.android.com/reference/android/view/View.html#onKeyLongPress(int,android.view.KeyEvent(,我找不到软输入/键盘。

感谢您研究这个问题。

我自己找不到这个答案,所以我手动编码了解决方案。 我在KeyboardView.OnKeyboardActionListeneronPress()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
    }

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

相关内容

  • 没有找到相关文章

最新更新