如何在android中将焦点更改为下一个编辑文本?
用户只能在编辑文本中输入一位数字。如果他在edtText1中输入值,我希望光标自动移动到edtText2,依此类推。用户可以编辑他/她已经输入的文本。我试着用下面的方法如何在android中将焦点更改为下一个编辑文本?,android,android-edittext,Android,Android Edittext,用户只能在编辑文本中输入一位数字。如果他在edtText1中输入值,我希望光标自动移动到edtText2,依此类推。用户可以编辑他/她已经输入的文本。我试着用下面的方法 edtPasscode1.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Au
edtPasscode1.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (edtPasscode1.getText().length() == 1)
edtPasscode2.requestFocus();
return false;
}
});
edtPasscode2.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (edtPasscode2.getText().length() == 1)
edtPasscode3.requestFocus();
return false;
}
});
edtPasscode3.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (edtPasscode3.getText().length() == 1)
edtPasscode4.requestFocus();
return false;
}
});
如果用户编辑文本,光标将移动到其他一些编辑文本,并且无法按需要工作。如何实现上述目标?尝试TextWatcher而不是onKeyListener 因为如果你想编辑你的密码,在这种情况下,TextWatcher会给你更多的处理方法 编辑:-
StringBuilder sb=new StringBuilder();
edtPasscode1.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if(sb.length()==0&edtPasscode1.length()==1)
{
sb.append(s);
edtPasscode1.clearFocus();
edtPasscode2.requestFocus();
edtPasscode2.setCursorVisible(true);
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
if(sb.length()==1)
{
sb.deleteCharAt(0);
}
}
public void afterTextChanged(Editable s) {
if(sb.length()==0)
{
edtPasscode1.requestFocus();
}
}
});
希望这能奏效。将editeText的长度设置为
android:maxLength=“1”
,然后按照下面的代码进行操作
((EditText) findViewById(R.id.edi1)).addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if(((EditText) findViewById(R.id.edi1)).getText().toString().length()==1)
{
((EditText) findViewById(R.id.edi1)).clearFocus();
((EditText) findViewById(R.id.edi2)).requestFocus();
((EditText) findViewById(R.id.edi2)).setCursorVisible(true);
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
((EditText) findViewById(R.id.edi2)).addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if(((EditText) findViewById(R.id.edi2)).getText().toString().length()==1)
{
((EditText) findViewById(R.id.edi2)).clearFocus();
((EditText) findViewById(R.id.edi3)).requestFocus();
((EditText) findViewById(R.id.edi3)).setCursorVisible(true);
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
((EditText) findViewById(R.id.edi3)).addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if(((EditText) findViewById(R.id.edi3)).getText().toString().length()==1)
{
((EditText) findViewById(R.id.edi3)).clearFocus();
((EditText) findViewById(R.id.edi4)).requestFocus();
((EditText) findViewById(R.id.edi4)).setCursorVisible(true);
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
将
android:maxLength=“1”
设置为所有xml格式的ExitText
请尝试以下代码
edtxt1 = (EditText) findViewById(R.id.edtxt_phonenumber_one);
edtxt2 = (EditText) findViewById(R.id.edtxt_phonenumber_two);
edtxt3 = (EditText) findViewById(R.id.edtxt_phonenumber_three);
edtxt1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
if (s.length() ==1) {
edtxt2.requestFocus();
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
});
edtxt2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
if (s.length() == 1) {
edtxt3.requestFocus();
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
});
edtxt3.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
if (s.length() == 1) {
edtxt1.requestFocus();
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
});
这应该可以使用您可以使用隐藏的编辑文本接收输入,四个文本视图来显示密码 例如: 对话框\u passworld.xml
PasswordDialogBuilder.java
公共类PasswordDialogBuilder扩展了AlertDialog.Builder{
公共密码对话框生成器(上下文){
超级(上下文、displayMetrics、eventManager);
查看contentView=LayoutInflater.from(上下文)。充气(R.layout.dialog\u密码,null);
LinearLayout passcodeContainer=(LinearLayout)contentView.findviewbyd(R.id.passcode\u容器);
最终列表密码视图=新的ArrayList();
int childCount=passcodeContainer.getChildCount();
for(int i=0;i
解决方案编码正常
下面的代码表示自动移动到下一个编辑文本和自动移动到上一个编辑文本
如果您在下面使用Rxjava+数据绑定+RxBinding,也可以:
// Show button Active code when enough fields active code
Observable<Boolean> mObsPhoneVerify1 = RxTextView.textChanges(db.etPhoneVerify1)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
db.etPhoneVerify2.requestFocus();
return true;
} else {
db.etPhoneVerify1.requestFocus();
return false;
}
});
Observable<Boolean> mObsPhoneVerify2 = RxTextView.textChanges(db.etPhoneVerify2)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
db.etPhoneVerify3.requestFocus();
return true;
} else {
db.etPhoneVerify1.requestFocus();
return false;
}
});
Observable<Boolean> mObsPhoneVerify3 = RxTextView.textChanges(db.etPhoneVerify3)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
db.etPhoneVerify4.requestFocus();
return true;
} else {
db.etPhoneVerify2.requestFocus();
return false;
}
});
Observable<Boolean> mObsPhoneVerify4 = RxTextView.textChanges(db.etPhoneVerify4)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
hideKeyboard();
return true;
} else {
/*
If enough text for all fields, no need cursor
Otherwise, focus previous edit text
*/
if (Utils.isValidEditText(db.etPhoneVerify1) && Utils.isValidEditText(db.etPhoneVerify2) && Utils.isValidEditText(db.etPhoneVerify3)) {
db.etPhoneVerify3.requestFocus();
} else {
db.etPhoneVerify1.clearFocus();
db.etPhoneVerify2.clearFocus();
db.etPhoneVerify3.clearFocus();
db.etPhoneVerify4.clearFocus();
}
return false;
}
});
disposable = Observable
.combineLatest(mObsPhoneVerify1, mObsPhoneVerify2, mObsPhoneVerify3, mObsPhoneVerify4,
(PhoneVerify1, PhoneVerify2, PhoneVerify3, PhoneVerify4)
-> PhoneVerify1 && PhoneVerify2 && PhoneVerify3 && PhoneVerify4)
.compose(regisObserver(false))
.subscribe(aBoolean -> {
db.btnActiveCode.setEnabled(aBoolean);
});
//当有足够的字段激活代码时显示按钮激活代码
Observable mObsPhoneVerify1=RxTextView.textChanges(db.etPhoneVerify1)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
db.etPhoneVerify2.requestFocus();
返回true;
}否则{
db.etPhoneVerify1.requestFocus();
返回false;
}
});
可观察的mObsPhoneVerify2=RxTextView.textChanges(db.etPhoneVerify2)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
db.etPhoneVerify3.requestFocus();
返回true;
}否则{
db.etPhoneVerify1.requestFocus();
返回false;
}
});
Observable mObsPhoneVerify3=RxTextView.textChanges(db.etPhoneVerify3)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
db.etPhoneVerify4.requestFocus();
返回true;
}否则{
db.etPhoneVerify2.requestFocus();
返回false;
}
});
Observable mObsPhoneVerify4=RxTextView.textChanges(db.etPhoneVerify4)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
隐藏板();
返回true;
}否则{
/*
如果所有字段都有足够的文本,则不需要光标
否则,聚焦上一个编辑文本
*/
if(Utils.isvaliditext(db.etPhoneVerify1)和&Utils.isvaliditext(db.etPhoneVerify2)和&Utils.isvaliditext(db.etPhoneVerify3)){
db.etPhoneVerify3.requestFocus();
}否则{
public class PasswordDialogBuilder extends AlertDialog.Builder {
public PasswordDialogBuilder(Context context) {
super(context, displayMetrics, eventManager);
View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_password, null);
LinearLayout passcodeContainer = (LinearLayout) contentView.findViewById(R.id.passcode_container);
final List<TextView> passwordViews = new ArrayList<TextView>();
int childCount = passcodeContainer.getChildCount();
for (int i = 0; i < childCount; i++) {
View childView = passcodeContainer.getChildAt(i);
if (childView instanceof TextView) {
passwordViews.add((TextView) childView);
}
}
final int passwordCount = passwordViews.size();
EditText passwordView = (EditText) contentView.findViewById(R.id.passcode);
passwordView.setFilters(new InputFilter[] {new InputFilter.LengthFilter(passwordCount)});
passwordView.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
passwordView.setCursorVisible(false);
passwordView.setTextColor(Color.TRANSPARENT);
passwordView.setBackgroundColor(Color.TRANSPARENT);
passwordView.setSingleLine();
passwordView.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 s) {
int passwordLength = s.length();
for (int i = 0; i < passwordCount; i++) {
TextView passcodeView = passwordViews.get(i);
if (i < passwordLength) {
passcodeView.setText(String.valueOf(s.charAt(i)));
} else {
passcodeView.setText(StringUtils.EMPTY);
}
}
if (positiveButton != null) {
positiveButton.setEnabled(passwordLength == passwordCount);
}
}
});
setView(contentView);
}
}
// Show button Active code when enough fields active code
Observable<Boolean> mObsPhoneVerify1 = RxTextView.textChanges(db.etPhoneVerify1)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
db.etPhoneVerify2.requestFocus();
return true;
} else {
db.etPhoneVerify1.requestFocus();
return false;
}
});
Observable<Boolean> mObsPhoneVerify2 = RxTextView.textChanges(db.etPhoneVerify2)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
db.etPhoneVerify3.requestFocus();
return true;
} else {
db.etPhoneVerify1.requestFocus();
return false;
}
});
Observable<Boolean> mObsPhoneVerify3 = RxTextView.textChanges(db.etPhoneVerify3)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
db.etPhoneVerify4.requestFocus();
return true;
} else {
db.etPhoneVerify2.requestFocus();
return false;
}
});
Observable<Boolean> mObsPhoneVerify4 = RxTextView.textChanges(db.etPhoneVerify4)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
if (!charSequence.toString().equals("")) {
hideKeyboard();
return true;
} else {
/*
If enough text for all fields, no need cursor
Otherwise, focus previous edit text
*/
if (Utils.isValidEditText(db.etPhoneVerify1) && Utils.isValidEditText(db.etPhoneVerify2) && Utils.isValidEditText(db.etPhoneVerify3)) {
db.etPhoneVerify3.requestFocus();
} else {
db.etPhoneVerify1.clearFocus();
db.etPhoneVerify2.clearFocus();
db.etPhoneVerify3.clearFocus();
db.etPhoneVerify4.clearFocus();
}
return false;
}
});
disposable = Observable
.combineLatest(mObsPhoneVerify1, mObsPhoneVerify2, mObsPhoneVerify3, mObsPhoneVerify4,
(PhoneVerify1, PhoneVerify2, PhoneVerify3, PhoneVerify4)
-> PhoneVerify1 && PhoneVerify2 && PhoneVerify3 && PhoneVerify4)
.compose(regisObserver(false))
.subscribe(aBoolean -> {
db.btnActiveCode.setEnabled(aBoolean);
});
otp_1.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) {
}
@Override
public void afterTextChanged(Editable editable) {
//
if(editable.length()>0){
otp_1.clearFocus();
otp_2.requestFocus();
otp_2.setCursorVisible(true);
}
}
});
otp_2.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) {
}
@Override
public void afterTextChanged(Editable editable) {
//
if(editable.length() > 0) {
otp_2.clearFocus();
otp_3.requestFocus();
otp_3.setCursorVisible(true);
}
}
});
otp_3.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) {
}
@Override
public void afterTextChanged(Editable editable) {
if(editable.length() > 0) {
otp_3.clearFocus();
otp_4.requestFocus();
otp_4.setCursorVisible(true);
}
}
});
<EditText
android:id="@+id/edt1"
android:layout_width="40dp"
android:layout_height="40dp"
android:inputType="number"
android:textAlignment="center"
android:singleLine="true"
android:maxLength="1"
android:maxLines="1"
android:imeOptions="actionNext"
android:layout_margin="5dp"
android:background="@drawable/edittext_shape_bg"/>
<EditText
android:id="@+id/edt2"
android:layout_width="40dp"
android:layout_height="40dp"
android:inputType="number"
android:textAlignment="center"
android:singleLine="true"
android:maxLength="1"
android:imeOptions="actionNext"
android:maxLines="1"
android:layout_margin="5dp"
android:background="@drawable/edittext_shape_bg"/>
<EditText
android:id="@+id/edt3"
android:layout_width="40dp"
android:layout_height="40dp"
android:inputType="number"
android:textAlignment="center"
android:singleLine="true"
android:maxLength="1"
android:imeOptions="actionNext"
android:maxLines="1"
android:layout_margin="5dp"
android:background="@drawable/edittext_shape_bg"/>
edt1.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) {
}
@Override
public void afterTextChanged(Editable editable) {
String edtChar=edt1.getText().toString();
if(edtChar.length()==1)
{
currentCode.append(edtChar);
edt2.requestFocus();
}else if(edtChar.length()==0) {
currentCode.deleteCharAt(0);
edt1.requestFocus();
}
}
});
edt2.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) {
}
@Override
public void afterTextChanged(Editable editable) {
String edtChar=edt2.getText().toString();
if(edtChar.length()==1)
{
currentCode.append(edtChar);
edt3.requestFocus();
}else if(edtChar.length()==0) {
currentCode.deleteCharAt(1);
edt1.requestFocus();
}
}
});
edt3.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) {
}
@Override
public void afterTextChanged(Editable editable) {
String edtChar=edt3.getText().toString();
if(edtChar.length()==1)
{
currentCode.append(edtChar);
edt4.requestFocus();
}else if(edtChar.length()==0) {
currentCode.deleteCharAt(2);
edt2.requestFocus();
}
}
});
<EditText
android:id="@+id/edtUsername"
android:nextFocusDown="@id/edtPassword"
style="@style/EditText"
/>
<EditText
android:id="@+id/edtPassword"
style="@style/EditText.Password"
/>
private fun addEditTextListener(editText: EditText?, nextEditText: EditText?) {
editText?.setOnFocusChangeListener { view, focused ->
if (focused) {
editText.text = null
}
}
editText?.addTextChangedListener {
if (it.toString().isNotEmpty()) {
if (nextEditText != null) {
nextEditText.requestFocus()
} else {
viewModel.confirmCode(
binding?.digit1?.text?.toString(),
binding?.digit2?.text?.toString(),
binding?.digit3?.text?.toString(),
binding?.digit4?.text?.toString(),
)
}
}
}
}
override fun setupViews() {
addEditTextListener(binding?.digit1, binding?.digit2)
addEditTextListener(binding?.digit2, binding?.digit3)
addEditTextListener(binding?.digit3, binding?.digit4)
addEditTextListener(binding?.digit4, null)
}