2

我刚刚构建了一个简单的聊天应用程序,它只包含一个EditText. 我设置inputTypetextShortMessage. 现在您可以输入表情符号了。

问题是在某些组合中甚至没有输入或消失表情符号。

代码看起来像这样(大部分是由 AndroidStudio 生成的,我添加了TextWatcher):

public class MainActivity extends AppCompatActivity {

    private boolean updateText = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText editText = (EditText)findViewById(R.id.editText);
        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) {
                if (updateText) {
                    updateText = false;
                    editText.setText(editText.getText());    // cause problems
                } else
                    updateText = true;
            }
        });
    }
}

可以通过键盘输入字符和表情符号(ImageSpan我猜是)(我使用虚拟设备的标准键盘)。但有些组合不能按预期工作。

如果将光标放在普通字符后面但表情符号之前,然后尝试键入另一个表情符号,它将不会出现。

您可以尝试通过最后插入中间部分来生成以下模式(C 是字符,E 是表情符号):

`CEC`   works
`CEE`   works NOT!
`EEE`   works
`EEC`   works

这个问题似乎是由editText.setText(editText.getText()). 但我不知道,为什么这在大多数情况下都有效,但有时却无效。

++编辑++

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (updateText)
    System.out.println("X "+editText.getText().length());
}

@Override
public void afterTextChanged(Editable s) {
    if (updateText) {
        updateText = false;
        System.out.println("A " + editText.getText().length());
        editText.setText(editText.getText());
        System.out.println("B "+editText.getText().length());
    } else
        updateText = true;
}

如果您输入普通字符:X 为 1(或使用表情符号 2,因为它可能包含两个字符)小于 A 和 B。这也适用于

//editText.setText(editText.getText());

如果您引起问题:X = A = B

这很令人不安,因为这意味着 A 似乎“知道”文本将提前一行更改。通常,我希望如果该行导致问题,则该行(A)之前setText(...);的文本长度必须比 B 大 1(或 2)并且表情符号在. 但是 A = B 所以表情符号在到达之前就丢失了。setText(...); setText(...);

这也可以通过使用onTextChanged方法观察到。此方法中文本的​​长度(如果出错)等于文本更改前的长度(X)。似乎输入甚至没有注册。

4

0 回答 0