文本跨越多个编辑文本,Android
Text spanned over multiple edittext, Android
所以,我希望用户输入 his/her 汽车的 his/her 号牌,并且我希望它通过像这张图片那样分隔所有字符来非常时尚:enter image description here
现在它由 6 个 EditText 和 TextWatchers 组成,这些 TextWatchers 可以改变每个输入的焦点。那部分工作正常,但我的问题是删除 och 字符。
当用户想要编辑一个字段时,he/she 只需单击查看、删除和替换即可。虽然当整个事情出错时,不可能一次删除所有内容,但您必须单击每个视图并手动删除。
所以我需要的是当用户在空视图上按下退格键时,它应该将焦点切换到之前的那个并删除那个字符等等。所以所有的 EditTexts 都将连接起来并作为一个整体工作。我试过使用 KeyListeners 来听退格键,但它只适用于硬件键盘,而不适用于 phone.
上的软键盘
如果有人能指出比这个更好的解决方案,我也很高兴。
TextWatcher:
registrationPlateEditTexts 是按顺序排列的所有 EditText 的列表。
private TextWatcher regPlateTextWatcher = 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) {
for (int i=registrationPlateEditTexts.size()-1; i>=0; i--){
if (registrationPlateEditTexts.get(i).getText().length()==1 && i!=registrationPlateEditTexts.size()-1){
registrationPlateEditTexts.get(i+1).requestFocus();
return;
}
else if (registrationPlateEditTexts.get(i).getText().length()==1){
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
@Override public void afterTextChanged(Editable s) {}
};
else if (registrationPlateEditTexts.get(i).getText().length()==1){
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
@Override public void afterTextChanged(Editable s) {}
};`
我选择了 4 个自定义编辑文本 属性 当您按返回时被选中。这是侦听器和 CustomEditText 元素
mCodeFourEt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
mConfirmBtn.performClick();
return true;
}
return false;
}
});
mCodeTwoEt.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
String text = mCodeTwoEt.getText().toString();
if (text.length() == 0) {
mCodeOneEt.requestFocus();
mCodeOneEt.selectAll();
return true;
}
}
return false;
}
});
mCodeThreeEt.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
String text = mCodeThreeEt.getText().toString();
if (text.length() == 0) {
mCodeTwoEt.requestFocus();
mCodeTwoEt.selectAll();
return true;
}
}
return false;
}
});
mCodeFourEt.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
String text = mCodeFourEt.getText().toString();
if (text.length() == 0) {
mCodeThreeEt.requestFocus();
mCodeThreeEt.selectAll();
return true;
}
}
return false;
}
});
mCodeOneEt.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 (mCodeOneEt.getText().toString().length() > 0) {
mCodeTwoEt.requestFocus();
}
}
});
mCodeTwoEt.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 (mCodeTwoEt.getText().toString().length() > 0) {
mCodeThreeEt.requestFocus();
}
}
});
mCodeThreeEt.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 (mCodeThreeEt.getText().toString().length() > 0) {
mCodeFourEt.requestFocus();
}
}
});
mCodeFourEt.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) {
}
});
现在是自定义编辑文本 class
public class CustomEditText extends android.support.v7.widget.AppCompatEditText {
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context) {
super(context);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new ZanyInputConnection(super.onCreateInputConnection(outAttrs),
true);
}
private class ZanyInputConnection extends InputConnectionWrapper {
public ZanyInputConnection(InputConnection target, boolean mutable) {
super(target, mutable);
}
@Override
public boolean sendKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
// Un-comment if you wish to cancel the backspace:
// return false;
}
return super.sendKeyEvent(event);
}
@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
// magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
if (beforeLength == 1 && afterLength == 0) {
// backspace
return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
}
return super.deleteSurroundingText(beforeLength, afterLength);
}
}
}
只需在您的 XML 中使用此自定义 class 并查看上面的示例,该示例适用于 4 个编辑文本。
所以,我希望用户输入 his/her 汽车的 his/her 号牌,并且我希望它通过像这张图片那样分隔所有字符来非常时尚:enter image description here
现在它由 6 个 EditText 和 TextWatchers 组成,这些 TextWatchers 可以改变每个输入的焦点。那部分工作正常,但我的问题是删除 och 字符。 当用户想要编辑一个字段时,he/she 只需单击查看、删除和替换即可。虽然当整个事情出错时,不可能一次删除所有内容,但您必须单击每个视图并手动删除。
所以我需要的是当用户在空视图上按下退格键时,它应该将焦点切换到之前的那个并删除那个字符等等。所以所有的 EditTexts 都将连接起来并作为一个整体工作。我试过使用 KeyListeners 来听退格键,但它只适用于硬件键盘,而不适用于 phone.
上的软键盘如果有人能指出比这个更好的解决方案,我也很高兴。
TextWatcher:
registrationPlateEditTexts 是按顺序排列的所有 EditText 的列表。
private TextWatcher regPlateTextWatcher = 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) {
for (int i=registrationPlateEditTexts.size()-1; i>=0; i--){
if (registrationPlateEditTexts.get(i).getText().length()==1 && i!=registrationPlateEditTexts.size()-1){
registrationPlateEditTexts.get(i+1).requestFocus();
return;
}
else if (registrationPlateEditTexts.get(i).getText().length()==1){
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
@Override public void afterTextChanged(Editable s) {}
};
else if (registrationPlateEditTexts.get(i).getText().length()==1){
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
@Override public void afterTextChanged(Editable s) {}
};`
我选择了 4 个自定义编辑文本 属性 当您按返回时被选中。这是侦听器和 CustomEditText 元素
mCodeFourEt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
mConfirmBtn.performClick();
return true;
}
return false;
}
});
mCodeTwoEt.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
String text = mCodeTwoEt.getText().toString();
if (text.length() == 0) {
mCodeOneEt.requestFocus();
mCodeOneEt.selectAll();
return true;
}
}
return false;
}
});
mCodeThreeEt.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
String text = mCodeThreeEt.getText().toString();
if (text.length() == 0) {
mCodeTwoEt.requestFocus();
mCodeTwoEt.selectAll();
return true;
}
}
return false;
}
});
mCodeFourEt.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
String text = mCodeFourEt.getText().toString();
if (text.length() == 0) {
mCodeThreeEt.requestFocus();
mCodeThreeEt.selectAll();
return true;
}
}
return false;
}
});
mCodeOneEt.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 (mCodeOneEt.getText().toString().length() > 0) {
mCodeTwoEt.requestFocus();
}
}
});
mCodeTwoEt.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 (mCodeTwoEt.getText().toString().length() > 0) {
mCodeThreeEt.requestFocus();
}
}
});
mCodeThreeEt.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 (mCodeThreeEt.getText().toString().length() > 0) {
mCodeFourEt.requestFocus();
}
}
});
mCodeFourEt.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) {
}
});
现在是自定义编辑文本 class
public class CustomEditText extends android.support.v7.widget.AppCompatEditText {
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context) {
super(context);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new ZanyInputConnection(super.onCreateInputConnection(outAttrs),
true);
}
private class ZanyInputConnection extends InputConnectionWrapper {
public ZanyInputConnection(InputConnection target, boolean mutable) {
super(target, mutable);
}
@Override
public boolean sendKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
// Un-comment if you wish to cancel the backspace:
// return false;
}
return super.sendKeyEvent(event);
}
@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
// magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
if (beforeLength == 1 && afterLength == 0) {
// backspace
return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
}
return super.deleteSurroundingText(beforeLength, afterLength);
}
}
}
只需在您的 XML 中使用此自定义 class 并查看上面的示例,该示例适用于 4 个编辑文本。