我試圖實現以下目的:我的佈局有一些EditTexts。當用戶第一次觸摸其中一個EditText時,鍵盤不應該打開,但EditText應該只是獲得焦點。這是因爲我在EditText中進行計算時,它獲得焦點並且我想將結果顯示給用戶。然後,當用戶看到結果時,他可以再次觸摸EditText,它將選擇All並打開鍵盤輸入新號碼。僅在第二次觸摸時纔打開鍵盤EditText
這是我使用的是現在的代碼:
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
變量來區分第二和將遵循的那些第一觸摸。 iFocus
在focusChangeListener中設置並保存具有焦點的最後一個EditText。
代碼有時可以正常工作,但並不總是如此。有時候,鍵盤不能打開或已經在第一次觸摸,有時文本沒有被選中,等等。
TouchEvent可能以某種方式反彈嗎?所以TouchListener的執行次數比我預期的要多?我也嘗試將down事件和up事件分開,但這沒有幫助。
有沒有人一個好主意我想怎麼做可以實現更好的方式?由於
編輯:這是我的最終解決方案:
myEditText.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
myEditText.requestFocus();
if(iCount == 1){
myEditText.postDelayed(new Runnable() {
public void run() {
InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
manager.showSoftInput(myEditText, 0);
myEditText.selectAll();
}
}, 200);
}
iCount++;
break;
default:
break;
}
if(iCount >= 2) return false;
else return true;
}
});
我想這並不是真的在做我想做的事情。只有在第二次觸摸時才需要關注焦點?這不是我所需要的...並且觸摸後200毫秒打開鍵盤?我希望它在第二次觸摸時打開: -/ – Reto
因此,它在第二次觸摸時不會打開你? –
現在查看我編輯的答案.... –