2011-10-19 96 views
2

我試圖實現以下目的:我的佈局有一些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; 
     } 
    }); 

回答

4

更換 myEditText.setOnTouchListener(...); 試試這個,它的工作對我來說,當我接觸到的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; 
     } 
}); 
+0

我想這並不是真的在做我想做的事情。只有在第二次觸摸時才需要關注焦點?這不是我所需要的...並且觸摸後200毫秒打開鍵盤?我希望它在第二次觸摸時打開: -/ – Reto

+0

因此,它在第二次觸摸時不會打開你? –

+0

現在查看我編輯的答案.... –

3

嘗試與 myEditText.setOnClickListener(...);

+0

試過了,但鍵盤確實已經打開了第一次點擊... – Reto

0

讓TextView與EditText具有相同的背景和大小,並在第一次點擊時切換它們,並在EditText失去焦點時再次切換它們。

或者先存儲當前的getKeyListener(),setKeyListener(null),然後在第一次點擊後恢復。

或子類EditText並重寫getDefaultEditable()以返回false,除非它已具有焦點。

+0

我不太瞭解你的第二個選擇,但最後一個聽起來很有趣。你能給我一個代碼示例如何看起來像? – Reto

相關問題