Правка текста переходит к следующим правкам текста после достижения максимальной длины текста правки.

1

Мой вопрос очень похож на этот пост: текст редактирования переходит к следующему тексту редактирования после достижения максимальной длины текста редактирования

Но, что бы я ни пытался сделать, я не могу перейти к третьему тексту редактирования, как показано на рисунке ниже. Я записываю 10 в первый текст редактирования, и он автоматически перемещается во второй текст редактирования, но когда я пишу 12, он не перемещается в третий текст редактирования. Я попробовал пару вещей, но не смог справиться с этим. Мне нужно простое решение этой проблемы до 10-15 edittexts. Кто-нибудь может мне помочь с синтаксисом? Благодарю.

Изображение 174551

Вот моя деятельность основной XML

<EditText
    android:id="@+id/edittext1"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:maxLength="2"
    android:hint="1"
    android:layout_weight="1"/>
<EditText
    android:id="@+id/edittext2"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:maxLength="2"
    android:digits="0123456789 "
    android:hint="2"
    android:layout_weight="1"/>
<EditText
    android:id="@+id/edittext3"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:maxLength="2"
    android:digits="0123456789 "
    android:hint="3"
    android:layout_weight="1"/>

И вот моя основная деятельность

package com.example.serkan.justtry;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements TextWatcher {
    EditText edt1;
    EditText edt2;
    EditText edt3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    edt1=(EditText)findViewById(R.id.edittext1);
    edt2=(EditText)findViewById(R.id.edittext2);
    edt3=(EditText)findViewById(R.id.edittext3);

    edt1.addTextChangedListener(this);
}

@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}

@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}

@Override
public void afterTextChanged(Editable editable) {
    if (edt1.length() == 2) {
        edt2.requestFocus();
    }
}
}
Теги:
android-edittext

4 ответа

1
Лучший ответ

Вам нужно также установить список в edt2

    edt2.addTextChangedListener(this);

просто замени

    @Override
    public void afterTextChanged(Editable editable) {

        if(edt1.getText().hashCode() == editable.hashCode()){
            if (edt1.length() == 2) {
                edt2.requestFocus();
            }
        }
        else if( edt2.getText().hashCode() == editable.hashCode()){
            if (edt2.length() == 2) {
                edt3.requestFocus();
            }
        }
    }
  • 0
    Спасибо, но все еще застрял во втором тексте редактирования :(
  • 0
    удалить остальное, если и только если проверить обновленный ответ
0

В файле XML нет проблем. Просто попробуйте следующий код в MainActivity.java

  1. Добавить TextChangedListener во второй текст редактирования

    edt2.addTextChangedListener(this);

  2. Вставьте следующий код в метод onTextChanged 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(edt1.hasFocus())
        {
            if(edt1.getText().toString().length()==2)     //size as per your requirement
            {
                edt2.requestFocus();
            }
        }
        if(edt2.hasFocus())
        {
            if(edt2.getText().toString().length()==2)     //size as per your requirement
            {
                edt3.requestFocus();
            }
        }
    
    }
    
    @Override
    public void afterTextChanged(Editable editable) {
    
    }
    

Я надеюсь, что этот ответ решит вашу проблему :)

0

Добавьте это как внутренний класс в свою деятельность:

private class MyTextWatcher implements TextWatcher {

    private final int maxLength;
    private final EditText next;

    MyTextWatcher(int maxLength, int nextId) {
        this.maxLength = maxLength;
        this.next = (nextId != -1) ? findViewById(nextId) : null;
    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (editable.length() >= maxLength && next != null) {
            next.requestFocus();
        }
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        // do nothing
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        // do nothing
    }
}

И затем установите его для каждого EditText следующим образом:

edittext1.addTextChangedListener(new MyTextWatcher(2, edittext1.getNextFocusDownId()));
edittext2.addTextChangedListener(new MyTextWatcher(2, edittext2.getNextFocusDownId()));
edittext3.addTextChangedListener(new MyTextWatcher(2, edittext3.getNextFocusDownId()));

Это зависит от установки атрибута nextFocusDown в макете:

<EditText
    android:id="@+id/edittext1"
    android:nextFocusDown="@+id/edittext2"
    .../>
0

Вы не установили TextChangedListener на 2 других EditTexts. Слушатель не знает, когда он должен изменить фокус с edt2 на edt3.

Добавьте слушателя к edt2 на вашем onCreate.

edt2.addTextChangedListener(this);

И обновите afterTextChanged

@Override
public void afterTextChanged(Editable editable) {

    if (editable == edt1.getEditableText()) {
        if (edt1.length() == 2) {
            edt2.requestFocus();
        }
    } else if (editable == edt2.getEditableText()) {
        if (edt2.length() == 2) {
            edt3.requestFocus();
        }
    }
}

Я не проверял. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню