5

私の Android アプリケーションでは、実装するために TextWatcher インターフェイスを実装する必要がありますonTextChanged。私が抱えている問題は、同じ EditText を余分な文字列で更新したいということです。これを実行しようとすると、プログラムが終了します。

 final EditText ET = (EditText) findViewById(R.id.editText1);
 ET.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count)
        {
            try
            {
                 ET.setText("***"+ s.toString());
                 ET.setSelection(s.length());
            }
            catch(Exception e)
            {
                Log.v("State", e.getMessage());
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after)
        {

        }

        @Override
        public void afterTextChanged(Editable s)
        {               
        }
    });

私のプログラムは終了し、コードのように例外をキャッチしようとしても終了します。なぜこれが起こるのか、どうすればこれを達成できるのか、誰にも分かりますか? ありがとう。

4

4 に答える 4

11

のコンテンツは、イベントでTextView編集できませんonTextChanged

代わりにafterTextChanged、テキストを変更できるようにイベントを処理する必要があります。

詳細な説明については、 Android TextWatcher.afterTextChanged と TextWatcher.onTextChangedを参照してください。


:エラーonTextChanged

明らかに、イベントのテキストを継続的に変更することで無限ループを引き起こしています。afterTextChanged

参照から:

public abstract void afterTextChanged (Editable s)
このメソッドは、 内のどこかでテキストが変更されたことを通知するために呼び出されます。このコールバックから s をさらに変更することは正当ですが、変更を加えるとこのメソッドが再帰的に再度呼び出されるため、無限ループに陥らないように注意してください。...

  • 提案 1 : 可能であれば、イベントがトリガーされたときに既にs必要なものであるかどうかを確認してください。

    @Override
    public void afterTextChanged(Editable s)
    {    
        if( !s.equalsIngoreCase("smth defined previously"))
             s = "smth defined previously";              
    }
    
  • 提案 2 : より複雑なこと (フォーマット、検証) を行う必要がある場合は、この投稿synchronizedのような方法を使用できます。

注 2 :最後の4文字 ( ****four)までn 個の星で部分的に非表示として入力をフォーマットする

提案 1で次のようなものを使用できます。

    @Override
    public void afterTextChanged(Editable s)
    {    
       String sText = ET.getText().toString()

        if( !isFormatted(sText))
             s = format(sText);              
    }
    bool isFormatted(String s)
    {
     //check if s is already formatted
    }

    string format(String s)
    {
      //format s & return
    }
于 2012-02-29T11:25:10.343 に答える
1

Zortkun の回答(コード例がかなり壊れている)を補足するために、これはafterTextChanged()同じものを更新するために使用する方法ですEditText:

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {    
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {    
    }

    @Override
    public void afterTextChanged(Editable editable) {        
        if (!editable.toString().startsWith("***")) {
            editable.insert(0, "***");
        }        
    }
});

インターフェイスに慣れて、Editable以外の操作について学習しますinsert()

無限ループ (変更が再びトリガーされる) に陥りやすいことに注意してください。そのため、通常は、上記のように if 条件内でafterTextChanged()変更を行います。

afterTextChanged() javadocsが言うように:

このコールバックから s をさらに変更することは正当ですが、変更を加えるとこのメソッドが再帰的に再度呼び出されるため、無限ループに陥らないように注意してください。

于 2016-08-02T12:40:30.140 に答える