我读了很多类似的问题,但是没有人回答我的问题或可以解决我的问题。 我在布局中有一个这样的EditText:
<EditText
android:id="@+id/editText2"
android:layout_width="248dp"
android:layout_height="59dp"
android:layout_marginStart="21dp"
android:layout_marginTop="36dp"
android:width="360dp"
android:ems="5"
android:hint="@string/ultimos4Dig"
android:inputType="number"
android:maxLength="10"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
我需要在用户书写月份和年份的数字时,在书写时出现斜线或消失。如果他写2个数字,则需要出现一个斜线。如果他擦除并且只有一个数字,则斜杠需要消失。
我需要在editText中将日期显示为:14/06
这是我的代码,但是不起作用。
protected void onCreate(Bundle savedInstanceState) {
EditText editText2 = (EditText) findViewById(R.id.editText2);
editText2.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable text) {
if (text.length() == 2) {
text.append('/');
}
}
});
仅供参考,我为此做了一堂课,谢谢
答案 0 :(得分:0)
在onTextChanged
而不是afterTextChanged
中添加逻辑
请尝试以下代码:
editText2 .addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String str=editText2 .getText().toString();
int textLength=editText2 .getText().length();
if (textLength == 3) {
if (!str.contains("/")) {
editText2 .setText(new StringBuilder(editText2 .getText().toString()).insert(str.length() - 1, "/").toString());
editText2 .setSelection(editText2 .getText().length());
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
希望它对您有用。
答案 1 :(得分:0)
使用屏蔽的编辑文本。
https://github.com/santalu/mask-edittext
<com.santalu.maskedittext.MaskEditText
android:id="@+id/editText2"
android:layout_width="248dp"
android:layout_height="59dp"
android:layout_marginStart="21dp"
android:layout_marginTop="36dp"
android:width="360dp"
android:ems="5"
android:hint="@string/ultimos4Dig"
android:inputType="number"
android:maxLength="10"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:met_mask="##/##"/>
答案 2 :(得分:0)
谢谢,几天后我得到了解决方案,这个课程:
public class EditMMYY extends AppCompatEditText implements TextWatcher
{
private String sPrev = "";
private int iMon = 0;
private int iYear = 0;
private void InitValue()
{
setInputType(InputType.TYPE_CLASS_NUMBER);
setFilters(new InputFilter[] {new InputFilter.LengthFilter(5)});
setHint("MM/YY");
}
public EditMMYY(Context context)
{
super(context);
InitValue();
}
public EditMMYY(Context context, AttributeSet attrs)
{
super(context, attrs);
InitValue();
}
public EditMMYY(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
InitValue();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
// Chequeo que el ingreso sea MM/YY
String sNew = s.toString();
int newLen = sNew.length();
if(sNew.equals(sPrev))
{
return;
}
switch(newLen)
{
case 0:
iMon = 0;
iYear = 0;
sPrev = sNew;
break;
case 1:
iMon = Integer.parseInt(sNew);
iYear = 0;
if(sPrev.length() == 0 && iMon > 1)
{ // Si se escribe un número mayor que 1, lo tomo como mes
sPrev = String.format("%02d/", iMon);
}
else
{
sPrev = sNew;
}
break;
case 2:
iMon = Integer.parseInt(sNew);
iYear = 0;
if(sPrev.length() == 1)
{
// Si ya es un mes válido, lo completo, sino dejo
// sPrev sin cambios hasta que se ingrese algo válido
if(iMon >= 1 && iMon <= 12)
{
sPrev = String.format("%02d/", iMon);
}
}
else
{
sPrev = sNew;
}
break;
case 3:
iMon = Integer.parseInt(sNew.substring(0, 2));
iYear = 0;
if(sPrev.length() == 2)
{
iMon = Integer.parseInt(sNew.substring(0, 2));
iYear = Integer.parseInt(sNew.substring(2, 3));
sPrev = String.format("%02d/%d", iMon, iYear);
}
else
{
sPrev = sNew;
}
break;
case 4:
case 5:
iMon = Integer.parseInt(sNew.substring(0, 2));
iYear = Integer.parseInt(sNew.substring(3, newLen));
sPrev = sNew;
break;
default:
sPrev = sNew;
break;
}
setText(sPrev);
setSelection(sPrev.length());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void afterTextChanged(Editable s)
{
}
public int getMon()
{
return iMon;
}
public int getYear()
{
return iYear;
}
}
答案 3 :(得分:0)
我认为这在某种程度上得到了解决。将 app:endIconMode="clear_text"
添加到 TextInputlayout。
dateOfBirth.getEditText().addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.length() == 2 || charSequence.length() == 5) {
if (!Pattern.compile("([0-9]{2})/").matcher(charSequence).matches()) {
dateOfBirth.getEditText().setText(new StringBuilder(dateOfBirth.getEditText().getText().toString()).insert(charSequence.length(), "/").toString());
dateOfBirth.getEditText().setSelection(dateOfBirth.getEditText().getText().length());
}
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});