我正在尝试实现以下目标:我的布局有许多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
答案 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,除非它已经有焦点。