2014-03-27 98 views
0

當用戶選擇一個EditText,我想光標位置從0開始。這個EditText的目的是爲了更容易地在一個時間HH格式輸入。設置光標位置爲0時EditText上獲得焦點

這裏是我的嘗試焦點變化監聽器:

txtStartHH.setOnFocusChangeListener(new OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) 
       txtStartHH.setSelection(0); 
     } 
    }); 

下面是我的文字守望者的代碼,這可能會或可能不相關:

txtStartHH.addTextChangedListener(new TextWatcher() 
    { 
     boolean formatting; 
     int mStart; 
     int mEnd; 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      this.mStart = -1; 
      mStart = start + count; 
      mEnd = Math.min(mStart + count, s.length()); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      if (!formatting) 
      { 
       formatting = true; 

       if (s.toString().length() == 3) 
       { 
        if (mStart >= 0) 
        { 
         if (s.toString().substring(mStart - 1, mStart).matches("[0-2]+") && mStart == 1) 
         { 
          if (Character.getNumericValue(s.charAt(0)) > 1 
            && Character.getNumericValue(s.charAt(mEnd)) > 3) 
          { 
           s.replace(mEnd, mEnd + 1, "3"); 
           s.replace(1, 2, ""); 
          } 
          else 
           s.replace(mStart, mEnd, ""); 
         } 
         else if (s.toString().substring(mStart, mEnd).matches("[0-9]+") && mStart == 2) 
         { 
          if (Character.getNumericValue(s.charAt(1)) > 3 
            && Character.getNumericValue(s.charAt(0)) > 1) 
          { 
           s.replace(0, 1, "1"); 
           s.replace(2, 3, ""); 
          } 
          else         
           s.replace(mStart, mEnd, ""); 
         } 
         else 
         { 
          // remove the character that has just been entered (i.e, cancels the insertion) 
          s.replace(mStart - 1, mStart, ""); 
         } 
        } 

        if (mStart > 2) 
        { 
         s.replace(mStart - 1, mStart, ""); 
        } 
       } 
       else 
       {     
        if (mStart == mEnd && s.toString().length() < 2) 
        { 
         if (mStart == 1) 
         { 
          // user has just backspaced the second char 
          s.insert(mStart, "0"); 
          mStart--; 
          txtStartHH.setSelection(mStart); 
         } 
         if (mStart == 0) 
         { 
          // user has just backspaced the first char 
          s.insert(mStart, "0"); 
          mStart--; 
          txtStartHH.setSelection(mStart); 
         } 
        } 
       } 

       formatting = false; 

       if (mStart > 1 && !jumpingTimes) 
       { 
        txtStartMM.requestFocus(); 
        txtStartMM.setSelection(0); 
       } 

      } 
     } 
    }); 

然而,當EditText正在獲得焦點,光標出現在EditText被按下的位置,而不是在開始處。這裏有什麼問題 - 有沒有其他方法可以使用它?

回答

0

OnFocusChangeListener被觸發時(在android將光標移動到按下的位置之前),而不是在用戶將屏幕上的手指向上拉時設置光標。

您可以使用setOnTouchListener()方法並檢查動作ACTION_UP來實現此目的。 例子:

txtStartHH.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP){ 
      if (hasFocus) { 
       txtStartHH.setSelection(0, 0); 
      } 
      return true; 
     } 
     return false; 
    } 
}); 
+0

不幸的是這只是突出顯示所有在該領域出於某種原因:( –

+0

這是奇怪的文字試着改變範圍從 - 標準 - '爲setSelection(0,0)' – Tautvydas

+0

一樣。我的'TextWatcher'修改'afterTextChanged'方法中的文本,如果改變選項的計數爲'Text Changed',那麼這可能是問題的原因,我不知道如何解決這個問題。 –