title: Android : KeyListener of EditText not working
body: <p>I'm trying to filter the input char of an EditText to allow only valid float value. (e.g. :"12,45", only one comma, ...). </p>
  
  <p>For this, I use the <a href="http://developer.android.com/reference/android/text/method/KeyListener.html" rel="nofollow">KeyListener</a> (dont confuse with onKeyListener or textChangeListener. I want to <em>prevent</em> the user from entering invalid data). </p>
  
  <p>On Android 2.3.6 and 3.2 the keyListener.filter() and keyListener.getAcceptedChars() are not called and I can introduce any char (not limited to .getAcceptedChars())</p>
  
  <p>I found little documentations about keyListener. If you got a good example or doc, I'm very interested.</p>
  
  <p>Any clue why this is not working ? </p>
  
  <p>What did I do wrong ?</p>
  
  <p>Activity Code sample:</p>
  
  <pre><code>    @Override
  
      protected void onCreate(Bundle savedInstanceState)
  
      {
  
          super.onCreate(...);
  
          setContentView(R.layout.editTextTest_lyt);
  
  ...
  
   mEditTextTest = (EditText) findViewById(R.id.editTextTest);
  
  mEditTextTest.setKeyListener(new NumberCommaDecimalKeyListenerTest());
  
  ...}
  </code></pre>
  
  <p>Layout Code sample:</p>
  
  <pre><code>editTextTest_lyt.xml:
              &lt;EditText
                  android:id="@+id/editTextTest"
                  android:layout_height="fill_parent"
                  android:layout_width="fill_parent"
                  android:layout_weight="1"
                  android:inputType="numberSigned|numberDecimal"
                  android:ems="5"
                  android:maxLength="9"
                  android:maxLines="1"
                  android:gravity="right|center_vertical"
                  android:imeOptions="actionNext"/&gt;
  </code></pre>
  
  <p>KeyListener Code sample:</p>
  
  <pre><code>public class NumberCommaDecimalKeyListenerTest extends NumberKeyListener {
  
  private static final char[] mAccepted = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', ',' };
      private static final boolean    mSign = true;
      private static final boolean    mDecimal = true;
  
      @Override
  
      protected char[] getAcceptedChars()
      {
        Log.e("LODA", "KeylistenerTest.getAcceptedChars()"); // DONT show up in logs 
          return mAccepted;
      }
  
      public NumberCommaDecimalKeyListenerTest()
      { super();
    Log.e("LODA", "CREATE KeylistenerTest"); // show up in logs 
      }
  
      @Override
      public int getInputType()
      {
      Log.e("LODA", "KeylistenerTest.getInputType()"); // show up in logs 
          int contentType = InputType.TYPE_CLASS_NUMBER;
          if (mSign)
          {
              contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED;
          }
          if (mDecimal)
          {
              contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;
          }
          return contentType;
      }
  
      @Override
      public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
      {
      Log.e("LODA", "enter KeylistenerTest.filter"); // DONT show up in logs 
  
          // My logic will go here...
  
          // if user pressed '.', is changed for ','
          source = source.toString().replace(".", ",");
          source = source.toString().replace("6", "9");
  
          CharSequence out = super.filter(source, start, end, dest, dstart, dend);
  
          return out;
      }
  
  }
  </code></pre>