単一のEditText
. に設定inputType
しましたtextShortMessage
。絵文字を入力できるようになりました。
問題は、絵文字が入力されなかったり消えたりする特定の組み合わせがあることです。
コードは次のようになります (ほとんどは 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 は A と B よりも 1 少なくなります (2 文字で構成されている可能性があるため、絵文字の場合は 2 になります)。
//editText.setText(editText.getText());
問題を起こす場合: X = A = B
これは、テキストが 1 行前に変更されることを A が「知っている」ように見えることを意味するため、非常に気がかりです。通常、行が問題を引き起こす場合、この行 (A) の前setText(...);
のテキストの長さはB よりも 1 (または 2) 大きくなければならず、. しかし、A = B なので、到達する前に絵文字が失われます。setText(...);
setText(...);
onTextChanged
これはメソッドを使用して観察することもできます。このメソッドのテキストの長さ (エラーの場合) は、テキストが変更される前の長さ (X) と同じです。入力さえ登録されていないようです。