@Override public void onStart() { formulaEditorKeyboard.setClickable(true); getView().requestFocus(); View.OnTouchListener touchListener = new View.OnTouchListener() { private Handler handler; private Runnable deleteAction; private boolean handleLongClick(final View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (handler == null) { return true; } handler.removeCallbacks(deleteAction); handler = null; } if (event.getAction() == MotionEvent.ACTION_DOWN) { deleteAction = new Runnable() { @Override public void run() { handler.postDelayed(this, 100); if (formulaEditorEditText.isThereSomethingToDelete()) { formulaEditorEditText.handleKeyEvent(view.getId(), ""); } } }; if (handler != null) { return true; } handler = new Handler(); handler.postDelayed(deleteAction, 400); } return true; } @Override public boolean onTouch(View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { updateButtonsOnKeyboardAndInvalidateOptionsMenu(); view.setPressed(false); handleLongClick(view, event); return true; } if (event.getAction() == MotionEvent.ACTION_DOWN) { view.setPressed(true); switch (view.getId()) { case R.id.formula_editor_keyboard_compute: InternFormulaParser internFormulaParser = formulaEditorEditText.getFormulaParser(); FormulaElement formulaElement = internFormulaParser.parseFormula(); if (formulaElement == null) { if (internFormulaParser.getErrorTokenIndex() >= 0) { formulaEditorEditText.setParseErrorCursorAndSelection(); } return false; } Formula formulaToCompute = new Formula(formulaElement); FormulaEditorComputeDialog computeDialog = new FormulaEditorComputeDialog(context); computeDialog.setFormula(formulaToCompute); computeDialog.show(); return true; case R.id.formula_editor_keyboard_function: showFormularEditorCategorylistFragment( FormulaEditorCategoryListFragment.FUNCTION_TAG, R.string.formula_editor_functions); return true; case R.id.formula_editor_keyboard_logic: showFormularEditorCategorylistFragment( FormulaEditorCategoryListFragment.LOGIC_TAG, R.string.formula_editor_logic); return true; case R.id.formula_editor_keyboard_object: showFormularEditorCategorylistFragment( FormulaEditorCategoryListFragment.OBJECT_TAG, R.string.formula_editor_choose_object_variable); return true; case R.id.formula_editor_keyboard_sensors: showFormularEditorCategorylistFragment( FormulaEditorCategoryListFragment.SENSOR_TAG, R.string.formula_editor_device); return true; case R.id.formula_editor_keyboard_data: showFormulaEditorDataFragment( FormulaEditorDataFragment.USER_DATA_TAG, R.string.formula_editor_data); return true; case R.id.formula_editor_keyboard_ok: endFormulaEditor(); return true; case R.id.formula_editor_keyboard_string: FragmentManager fragmentManager = ((Activity) context).getFragmentManager(); Fragment dialogFragment = fragmentManager.findFragmentByTag(NewStringDialog.DIALOG_FRAGMENT_TAG); if (dialogFragment == null) { dialogFragment = NewStringDialog.newInstance(); } ((NewStringDialog) dialogFragment) .show(fragmentManager, NewStringDialog.DIALOG_FRAGMENT_TAG); return true; case R.id.formula_editor_keyboard_delete: formulaEditorEditText.handleKeyEvent(view.getId(), ""); return handleLongClick(view, event); default: formulaEditorEditText.handleKeyEvent(view.getId(), ""); return true; } } return false; } }; for (int index = 0; index < formulaEditorKeyboard.getChildCount(); index++) { View tableRow = formulaEditorKeyboard.getChildAt(index); if (tableRow instanceof TableRow) { TableRow row = (TableRow) tableRow; for (int indexRow = 0; indexRow < row.getChildCount(); indexRow++) { row.getChildAt(indexRow).setOnTouchListener(touchListener); } } } updateButtonsOnKeyboardAndInvalidateOptionsMenu(); super.onStart(); }