2011-03-22 54 views
9

我想輸入1-60範圍內的值。 EditText不應該接受像61,62 ...,或0,-1,-2 ...EditText範圍內的值

如何才能給範圍1-60到EditText在Android? 我main.xml中已經做了作爲

<EditText android:layout_height="wrap_content" 
    android:id="@+id/editText1" 
    android:layout_width="160dip" 
    android:inputType="number"> 
    </EditText> 
+0

閱讀這個問題幾次後,它的不清楚在用戶打字時或在離開現場後你是否希望驗證和編輯輸入。在這兩種情況下,你都有兩個答案。 – Devunwired 2011-03-22 13:19:19

回答

17

您可以將TextWatcherEditText並傾聽文本的變化有,例如:

public void afterTextChanged(Editable s) { 
    try { 
    int val = Integer.parseInt(s.toString()); 
    if(val > 60) { 
     s.replace(0, s.length(), "60", 0, 2); 
    } else if(val < 1) { 
     s.replace(0, s.length(), "1", 0, 1); 
    } 
    } catch (NumberFormatException ex) { 
     // Do something 
    } 
} 

正如Devunwired提到,通知,調用s.replace()將遞歸地再次調用TextWatcher。

典型的做法是用布爾「編輯」標誌檢查這些更改,以便遞歸調用跳過並簡單地返回而來自內部的更改。

+4

+1:這是處理這個問題的正確方法,但應該注意,您在此處所做的更改通常會以遞歸方式再次調用TextWatcher。通常情況下,通過檢查布爾「編輯」標誌來對這些更改進行包裝,以便遞歸調用跳過並在更改來自內部時簡單地返回。 – Devunwired 2011-03-22 13:16:44

1

試試這個..

EditText.setOnEditorActionListener(new OnEditorActionListener() 
    { 
@Override 
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
{ 
    //add your condtion here. 
    return false; 
} 
}); 
2

爲什麼不使用搜索條相反的EditText的? 這樣,只有數字可以輸入,並且可以根據需要指定/修改最大限制。

public class SeekBar1 extends Activity implements SeekBar.OnSeekBarChangeListener { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    .. 
    mSeekBar = (SeekBar)findViewById(R.id.seekBar); 
    mSeekBar.setOnSeekBarChangeListener(this); 
    .. 
} 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { 
    //Do your Changes Here 
} 
public void onStartTrackingTouch(SeekBar seekBar) { 
    //On First Track Touch 
} 
public void onStopTrackingTouch(SeekBar seekBar) { 
    //On Stop Track Touch 
} 
} 

對於數字輸入類型值,Seekbar是最好的UI。雖然,它的精確度是有問題的。

1

非常有趣的問題。

我想最好的辦法是實現一個新的inputType,但setInputType方法收到一個int。無事可做有:(

在該方法的文檔,它說:

設置爲的inputType 該定義將改變 關鍵聽衆的關心與 不變的內容的類型,通過調用 setKeyListener(KeyListener的),匹配 給定的內容類型。

優秀,可以爲用戶提供一個setKeyListenerkeyListener

您可以擴展android.text.method.DigitsKeyListener以創建新的keyListener,避免了TextWatcher的問題。

1

這是有效的,但不是實時的。

editText.setOnFocusChangeListener(new OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       try { 
        int val = Integer.parseInt(editText.getText() 
          .toString()); 
        if (val > 2000) { 
         editText.setText(""); 
        } else if (val < 100) { 
         editText.setText(""); 
        } 
       } catch (NumberFormatException ex) { 
       } 
      } 
     }); 
5

我所遇到的一個巧妙的解決辦法here

public class InputFilterMinMax implements InputFilter { 

private int min, max; 

public InputFilterMinMax(int min, int max) { 
    this.min = min; 
    this.max = max; 
} 

public InputFilterMinMax(String min, String max) { 
    this.min = Integer.parseInt(min); 
    this.max = Integer.parseInt(max); 
} 

@Override 
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
    try { 
     int input = Integer.parseInt(dest.toString() + source.toString()); 
     if (isInRange(min, max, input)) 
      return null; 
    } catch (NumberFormatException nfe) { } 
    return ""; 
} 

private boolean isInRange(int a, int b, int c) { 
    return b > a ? c >= a && c <= b : c >= b && c <= a; 
} 
} 

,只需將此過濾器應用於編輯文本像這樣:

mCentsEditText = (EditText)v.findViewById(R.id.cents_edit_text); 
InputFilterMinMax filter = new InputFilterMinMax("0", "99") {}; 
mCentsEditText.setFilters(new InputFilter[]{filter}); 
+2

此解決方案不適用於5至35的範圍,因爲它現在允許您輸入11,因爲單個1小於5的最小值。 – jackdh 2017-02-27 18:57:49

+1

3年後,我認爲你是對的:)該死的。 – 2017-02-27 19:04:40

+0

仍然在谷歌搜索結果高,所以想讓人們知道。我通過硬編碼至少爲0來解決這個問題,並使用另一個檢查來確認它是正確的。 – jackdh 2017-02-27 19:11:03