仅在第二次触摸EditText时打开键盘

时间:2011-10-19 06:36:21

标签: android

我正在尝试实现以下目标:我的布局有许多EditTexts。当用户第一次触摸其中一个EditTexts时,键盘不应该打开,但EditText应该只是获得焦点。这是因为我在EditText中进行计算,当它获得焦点并且我想将结果显示给用户时。然后当用户看到结果时,他可以再次触摸EditText,这将选择All并打开键盘输入一个新号码。

这是我现在正在使用的代码:

myEditText.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if(iFocus == R.id.eTmyEditText) {
                if(iCount == 3) {
                    myEditText.selectAll();
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(myEditText, InputMethodManager.SHOW_IMPLICIT);
                }
                if(iCount > 3) return false;
                iCount++;
            }
            else iCount=0;
            myEditText.requestFocus();
            return true;
        }
});

我使用iCount变量来区分第一个触摸和第二个触摸以及随后的触摸。 {focus {1}}在focusChangeListener中设置并保存最后一个具有焦点的EditText。

代码工作正常,但并非总是如此。有时键盘没有打开或第一次触摸,有时文本没有被选中等等。

TouchEvent有可能以某种方式反弹吗?那么TouchListener的执行频率比我预期的要高吗?我也尝试将down事件和up事件分开,但这没有用。

有谁知道我想要做的事情能以更好的方式实施吗?感谢


编辑:这是我的最终解决方案:

iFocus

3 个答案:

答案 0 :(得分:4)

试试这个,当我两次触摸EditText时,它为我工作。

  mEditText.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                iCount++;
                if(iCount == 2){
                    mEditText.requestFocus();
                    InputMethodManager manager = (InputMethodManager) 
                                  getSystemService(Context.INPUT_METHOD_SERVICE);
                    manager.showSoftInput(mEditText, 0);
                    iCount = 0;
                }
                break;

            default:
                break;
            }
            return true;
        }
});

答案 1 :(得分:3)

尝试更换               myEditText.setOnTouchListener(...); 同               myEditText.setOnClickListener(...);

答案 2 :(得分:0)

具有与EditText具有相同背景和大小的TextView,并在第一次点击时在它们之间切换,并在EditText失去焦点时再次切换它们。

或者存储当前的getKeyListener(),setKeyListener(null),然后在第一次单击后恢复。

或者继承EditText并覆盖getDefaultEditable()以返回false,除非它已经有焦点。