5

キー入力をリッスンするために 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 回目の実行で間違ったテキストが表示されるのはなぜですか?

どうもありがとう。

4

1 に答える 1