キー入力をリッスンするために TextWatcher を使用しています。ユーザーが「@」と入力すると、リストアクティビティが開き、ユーザーはリストから選択する必要があります。選択したら、選択した項目のテキスト (最初の @ を含む) を edittext に配置し、通常の編集を続けます。
問題は、バックスペースを押すと、aftertextchanged イベントで取得した文字列が間違っていて、listactivity が再びポップアップすることです。
editText.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)
{
String str = s.toString();
if (str.length() > 0)
{
if (str.substring(str.length() - 1).equals("@"))
{
Intent i = new Intent(MessageComposeActivity.this, MembersListActivity.class);
startActivityForResult(i, Util.MEMBERS_LIST);
}
}
}
});
そして onActivityResult で:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Util.MEMBERS_LIST)
if (resultCode == RESULT_OK)
{
editText.setText(editText.getText().toString() + data.getExtras().get("screenname") + " ");
editText.setSelection(editText.getText().length());
}
}
例えば:
EditText に「@」と入力すると、アクティビティがポップアップ表示され、「James」を選択します。EditText に @James が表示されるようになりました。バックスペースを 1 回か 2 回押すと、EditText に @Jam が表示されている間にリスト アクティビティが再びポップアップします。
PS: afterTextChanged() は、バックスペース (または任意のキー) に対して 2 回呼び出されることがあります。afterTextChanged() の最初の実行で @Jam を取得し、2 回目の実行で「@」を取得するため、listactivity がポップアップします。
質問: afterTextChanged() が 2 回呼び出されるのはなぜですか? また、2 回目の実行で間違ったテキストが表示されるのはなぜですか?
どうもありがとう。