2011-03-22 183 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