在 android 中的所有编辑文本视图中的编辑文本中输入所有文本后,在 toast 中添加并显示所有文本
add and display all text in toast after enter all text in edit text in all edite text view in android
public class MainActivity extends ActionBarActivity {
EditText edtPasscode1;
EditText edtPasscode2;
EditText edtPasscode3;
EditText edtPasscode4;
Button button1;
StringBuilder sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtPasscode1 = (EditText) findViewById(R.id.editText1);
edtPasscode2 = (EditText) findViewById(R.id.editText2);
edtPasscode3 = (EditText) findViewById(R.id.editText3);
edtPasscode4 = (EditText) findViewById(R.id.editText4);
button1 = (Button) findViewById(R.id.button1);
sb = new StringBuilder();
sb.append(edtPasscode1.getText().toString());
sb.append(edtPasscode2.getText().toString());
sb.append(edtPasscode3.getText().toString());
sb.append(edtPasscode4.getText().toString());
edtPasscode1.addTextChangedListener(new TextWatcher() {
@Override
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);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
if (sb.length() == 1) {
sb.deleteCharAt(0);
}
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (sb.length() == 0) {
edtPasscode1.requestFocus();
}
}
});
edtPasscode2.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
if (sb.length() == 0 & edtPasscode2.length() == 1) {
sb.append(arg0);
edtPasscode2.clearFocus();
edtPasscode3.requestFocus();
edtPasscode3.setCursorVisible(true);
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
sb.deleteCharAt(0);
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
if (sb.length() == 0) {
edtPasscode2.requestFocus();
}
}
});
edtPasscode3.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
if (sb.length() == 0 & edtPasscode3.length() == 1) {
sb.append(s);
edtPasscode3.clearFocus();
edtPasscode4.requestFocus();
edtPasscode4.setCursorVisible(true);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
sb.deleteCharAt(0);
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (sb.length() == 0) {
edtPasscode3.requestFocus();
}
}
});
edtPasscode4.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
if (sb.length() == 0 & edtPasscode4.length() == 1) {
sb.append(arg0);
edtPasscode4.clearFocus();
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), sb.append(arg0).toString(), 10000).show();
}
});
}
}
这是我的代码 我有 4 个编辑文本 当我在第一个编辑文本键光标移动到另一个编辑文本 当输入第二个编辑文本键光标移动到第三个文本 当输入第三个编辑文本键光标移动到第四个我想当我输入第 4 个编辑文本时,我想在 toast 中显示所有文本值,即 edittext1.gettext()+edittext2.gettext()+edittext3.gettext()+edittext4.gettext() = 1234 其中 1 是在编辑文本 1 中输入 2 是在 2 中输入 3 是输入 3 4 是输入 4 分别请告诉我我在做什么 wrong.why 它不显示所有文本值它显示 onlu 34 请帮助!
在您的 EditText
TextWatcher
中,您正在使用 "beforeTextChanged" 删除字符串的第一个索引值:
sb.deleteCharAt(0);
这会删除为 1 和 2 输入的字符。您在 EditText
4 中没有这样做,因此您的结果包括 3 和 4,如前所述。
您可能不应该使用它。问题是您正在尝试 "automatically" 更改焦点,如果输入了错误的字符,这可能会导致糟糕的用户体验。这似乎是您要解释的内容。
您可能不应该尝试在输入一个字符时自动将光标从一个 space 移动到另一个,或者简单地 "enable" 每个,并防止输入超过 1 个字符。然后用afterTextChanged
4号EditText
像现在一样
编辑:
因为您正在使用 TextWatcher
,所以除了限制输入的字符数外,您不应该在 "beforeTextChanged" 中做任何事情。在 "onTextChanged" 中,您可以监视有效字符。您可能应该只尝试在 "afterTextChanged" 中改变焦点,但即使那样也不是真正的 "recommended",因为尝试输入 2 个字符(比如在输入“3”后重新获得焦点,然后简单地输入“4” ") 可能会带来 annoying/unexpected 用户体验。
编辑 2:
您的代码中仍然存在错误 - 例如,您在第二个 EditText 中进行此检查 "sb.length() == 0" - 但它的长度应该为 1,对吗?在我的回答中,我建议您在 Toast 之前不要尝试 "build" 字符串,因为 "requesting focus" 与禁用不同,所以在您进行交互之前,您可能会得到奇怪的结果( UX) 逻辑正确。
换句话说,你问 "why is it displaying only '34'" 我回答了。现在您在构建字符串时遇到了不同的错误。如果用户 "go back" 到一个编辑文本并删除一个字符,你将会有更多的错误,因为你的 StringBuilder 总是追加并且从不删除。您还必须根据用户所在的位置跟踪要修改的 "index"。
此外,您的 "afterTextChanged" 代码没有意义 - 当 StringBuilder 的长度为“0”时,您尝试 "requestFocus" 但只有当您从 [=18= 中删除时才会发生这种情况],你不知道。所以我不确定你想做什么,但它看起来不像你想要的那样。
编辑 3:
这里是一个应该有用的例子。暂时不要使用 StringBuilder。
在 edtPasscode4
中执行此操作:
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
edtPasscode1.getText().toString() +
edtPasscode2.getText().toString() +
edtPasscode3.getText().toString() +
edtPasscode4.getText().toString() +
, 10000).show();
}
public class MainActivity extends ActionBarActivity {
EditText edtPasscode1;
EditText edtPasscode2;
EditText edtPasscode3;
EditText edtPasscode4;
Button button1;
StringBuilder sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtPasscode1 = (EditText) findViewById(R.id.editText1);
edtPasscode2 = (EditText) findViewById(R.id.editText2);
edtPasscode3 = (EditText) findViewById(R.id.editText3);
edtPasscode4 = (EditText) findViewById(R.id.editText4);
button1 = (Button) findViewById(R.id.button1);
sb = new StringBuilder();
sb.append(edtPasscode1.getText().toString());
sb.append(edtPasscode2.getText().toString());
sb.append(edtPasscode3.getText().toString());
sb.append(edtPasscode4.getText().toString());
edtPasscode1.addTextChangedListener(new TextWatcher() {
@Override
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);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
if (sb.length() == 1) {
sb.deleteCharAt(0);
}
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (sb.length() == 0) {
edtPasscode1.requestFocus();
}
}
});
edtPasscode2.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
if (sb.length() == 0 & edtPasscode2.length() == 1) {
sb.append(arg0);
edtPasscode2.clearFocus();
edtPasscode3.requestFocus();
edtPasscode3.setCursorVisible(true);
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
sb.deleteCharAt(0);
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
if (sb.length() == 0) {
edtPasscode2.requestFocus();
}
}
});
edtPasscode3.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
if (sb.length() == 0 & edtPasscode3.length() == 1) {
sb.append(s);
edtPasscode3.clearFocus();
edtPasscode4.requestFocus();
edtPasscode4.setCursorVisible(true);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
sb.deleteCharAt(0);
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (sb.length() == 0) {
edtPasscode3.requestFocus();
}
}
});
edtPasscode4.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
if (sb.length() == 0 & edtPasscode4.length() == 1) {
sb.append(arg0);
edtPasscode4.clearFocus();
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), sb.append(arg0).toString(), 10000).show();
}
});
}
}
这是我的代码 我有 4 个编辑文本 当我在第一个编辑文本键光标移动到另一个编辑文本 当输入第二个编辑文本键光标移动到第三个文本 当输入第三个编辑文本键光标移动到第四个我想当我输入第 4 个编辑文本时,我想在 toast 中显示所有文本值,即 edittext1.gettext()+edittext2.gettext()+edittext3.gettext()+edittext4.gettext() = 1234 其中 1 是在编辑文本 1 中输入 2 是在 2 中输入 3 是输入 3 4 是输入 4 分别请告诉我我在做什么 wrong.why 它不显示所有文本值它显示 onlu 34 请帮助!
在您的 EditText
TextWatcher
中,您正在使用 "beforeTextChanged" 删除字符串的第一个索引值:
sb.deleteCharAt(0);
这会删除为 1 和 2 输入的字符。您在 EditText
4 中没有这样做,因此您的结果包括 3 和 4,如前所述。
您可能不应该使用它。问题是您正在尝试 "automatically" 更改焦点,如果输入了错误的字符,这可能会导致糟糕的用户体验。这似乎是您要解释的内容。
您可能不应该尝试在输入一个字符时自动将光标从一个 space 移动到另一个,或者简单地 "enable" 每个,并防止输入超过 1 个字符。然后用afterTextChanged
4号EditText
像现在一样
编辑:
因为您正在使用 TextWatcher
,所以除了限制输入的字符数外,您不应该在 "beforeTextChanged" 中做任何事情。在 "onTextChanged" 中,您可以监视有效字符。您可能应该只尝试在 "afterTextChanged" 中改变焦点,但即使那样也不是真正的 "recommended",因为尝试输入 2 个字符(比如在输入“3”后重新获得焦点,然后简单地输入“4” ") 可能会带来 annoying/unexpected 用户体验。
编辑 2:
您的代码中仍然存在错误 - 例如,您在第二个 EditText 中进行此检查 "sb.length() == 0" - 但它的长度应该为 1,对吗?在我的回答中,我建议您在 Toast 之前不要尝试 "build" 字符串,因为 "requesting focus" 与禁用不同,所以在您进行交互之前,您可能会得到奇怪的结果( UX) 逻辑正确。
换句话说,你问 "why is it displaying only '34'" 我回答了。现在您在构建字符串时遇到了不同的错误。如果用户 "go back" 到一个编辑文本并删除一个字符,你将会有更多的错误,因为你的 StringBuilder 总是追加并且从不删除。您还必须根据用户所在的位置跟踪要修改的 "index"。
此外,您的 "afterTextChanged" 代码没有意义 - 当 StringBuilder 的长度为“0”时,您尝试 "requestFocus" 但只有当您从 [=18= 中删除时才会发生这种情况],你不知道。所以我不确定你想做什么,但它看起来不像你想要的那样。
编辑 3:
这里是一个应该有用的例子。暂时不要使用 StringBuilder。
在 edtPasscode4
中执行此操作:
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
edtPasscode1.getText().toString() +
edtPasscode2.getText().toString() +
edtPasscode3.getText().toString() +
edtPasscode4.getText().toString() +
, 10000).show();
}