仿微信充值金额输入框-自定义EditText
仿微信充值金额输入框-自定义EditText
在这个项目中,我们需要实现一个自定义的EditText控件,用于输入金额。该控件应该具有以下特性:
* 只能输入数字* 第一位不能是小数点,如果第一位是小数点则默认在小数点前加0* 精确到小数点第二位一、布局代码
首先,我们需要在布局文件中定义一个EditText控件,并设置其inputType属性为number。
```xml android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" /> ``` 二、自定义EditText类 接下来,我们需要创建一个自定义的EditText类,继承于原生的EditText控件。 ```javapublic class CustomEditText extends EditText { public CustomEditText(Context context) { super(context); } public CustomEditText(Context context, AttributeSet attrs) { super(context, attrs); } public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } } ``` 三、添加数字键盘 为了实现只能输入数字的功能,我们需要在布局文件中添加一个数字键盘。 ```xml android:layout_height="wrap_content" android:orientation="vertical"> android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" /> android:layout_height="wrap_content" android:orientation="horizontal"> android:layout_height="wrap_content" android:orientation="horizontal"> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="3" /> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="4" /> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="5" /> android:layout_height="wrap_content" android:orientation="horizontal"> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="6" /> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="7" /> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="8" /> android:layout_height="wrap_content" android:orientation="horizontal"> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="9" /> android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="." /> ``` 四、添加点击事件 接下来,我们需要为每个数字键盘按钮添加点击事件。 ```javapublic class CustomEditText extends EditText { public CustomEditText(Context context) { super(context); } public CustomEditText(Context context, AttributeSet attrs) { super(context, attrs); } public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } } ``` 五、实现小数点前加0的功能 为了实现小数点前加0的功能,我们需要在EditText控件中添加一个方法。 ```javapublic class CustomEditText extends EditText { public CustomEditText(Context context) { super(context); } public CustomEditText(Context context, AttributeSet attrs) { super(context, attrs); } public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public String addZeroBeforeDecimal() { String text = getText().toString(); if (text.contains(".")) { int index = text.indexOf("."); if (index ==0) { return "0" + text; } } return text; } } ``` 六、实现精确到小数点第二位的功能 为了实现精确到小数点第二位的功能,我们需要在EditText控件中添加一个方法。 ```javapublic class CustomEditText extends EditText { public CustomEditText(Context context) { super(context); } public CustomEditText(Context context, AttributeSet attrs) { super(context, attrs); } public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public String addZeroAfterDecimal() { String text = getText().toString(); if (text.contains(".")) { int index = text.indexOf("."); if (index != -1 && index < text.length() -2) { return text + "00"; } } return text; } } ``` 七、测试 最后,我们需要测试一下我们的自定义EditText控件是否能够正常工作。 ```javapublic class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomEditText etAmount = findViewById(R.id.et_amount); Button btn0 = findViewById(R.id.btn_0); Button btn1 = findViewById(R.id.btn_1); Button btn2 = findViewById(R.id.btn_2); Button btn3 = findViewById(R.id.btn_3); Button btn4 = findViewById(R.id.btn_4); Button btn5 = findViewById(R.id.btn_5); Button btn6 = findViewById(R.id.btn_6); Button btn7 = findViewById(R.id.btn_7); Button btn8 = findViewById(R.id.btn_8); Button btn9 = findViewById(R.id.btn_9); btn0.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { etAmount.setText(etAmount.addZeroBeforeDecimal()); } }); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { etAmount.setText(etAmount.addZeroAfterDecimal()); } }); } } ``` 通过以上的步骤,我们可以实现一个自定义EditText控件,能够在小数点前加0,并且精确到小数点第二位。