3

私はこのようなEditTextにTextWatcherを持っています

// the text changed listener for the search field
private TextWatcher searchWatcher = new TextWatcher()
{

  @Override
  public void afterTextChanged(Editable span)
  {
    Log.v(TAG, "afterTextChanged: "+etSearch.getText().toString());
  }

  @Override
  public void beforeTextChanged(CharSequence s, 
                              int start, 
                              int count,
                              int after)
  {
    Log.v(TAG, "beforeTextChanged: "+etSearch.getText().toString()
      +"; start="+start+"; count="+count+"; after="+after);
  }

  @Override
  public void onTextChanged(CharSequence s, int start, int before, int count)
  {
    Log.v(TAG, "onTextChanged: "+etSearch.getText().toString());
  }
}

(ここで、etSearchは私のEdittextetSearch.addTextChangedListener(searchWatcher)です。)

2.1-update1を実行しているSonyEricssonXperiaと、2.1-update1を実行しているAVDがあります。エミュレーターで、EditTextをクリックし、ソフトキーボードを使用してabcと入力し、delボタンを1回押します。電話で、EditTextをタッチし、ソフトキーボードでabcと入力して、delを1回押します。電話で、私はこれを受け取ります:

beforeTextChanged: ; start=0; count=0; after=1
onTextChanged: a
afterTextChanged: a

beforeTextChanged: a; start=0; count=1; after=2
onTextChanged: ab
afterTextChanged: ab

beforeTextChanged: ab; start=0; count=2; after=3
onTextChanged: abc
afterTextChanged: abc

beforeTextChanged: abc; start=0; count=3; after=2
onTextChanged: ab
afterTextChanged: ab

エミュレーターでは、次のようになります。

beforeTextChanged: ; start=0; count=0; after=1
onTextChanged: a
afterTextChanged: a

beforeTextChanged: a; start=1; count=0; after=1
onTextChanged: ab
afterTextChanged: ab

beforeTextChanged: ab; start=2; count=0; after=1
onTextChanged: abc
afterTextChanged: abc

beforeTextChanged: abc; start=2; count=1; after=0
onTextChanged: ab
afterTextChanged: ab

なぜそれらは同じではないのですか?どちらが正しい動作ですか?

4

1 に答える 1

3

どちらの場合も完全に同じ操作を行っていると確信していますか? 違いはありますが、どちらの結果も理にかなっています。ただし、エミュレータの結果はより論理的に見えます。例えば:

beforeTextChanged: ab; start=2; count=0; after=1 

位置 2 (開始 = 2) にはそれ以上文字がありません (カウント = 0) が、さらに 1 文字追加されました (後 = 1)。abそして、文字列を からに拡張したときに、まさにそれが起こりましたabc

一方、Xperiaは言う

beforeTextChanged: ab; start=0; count=2; after=3 

さんは、位置 0 から始めて、既存の 2 文字を新しい 3 文字に置き換えたと言っています。この場合、最初から削除abして追加abcしたのでしょうか?

アップデート:

変更が行われた方法の更新された説明によると、正しい動作はエミュレーターで観察されたものです。

エミュレータで観察されたのと同じ動作が、Nexus One でも観察されます。したがって、Xperia で見られる動作は例外に近いと言えます。

于 2011-05-24T12:59:40.490 に答える