EditText Changed Listenerでの文字のカウント


272

私のプロジェクトでは、EditText。で文字を数え、EditTextその数をで示したいTextView。私は次のコードを書いて、それがうまくいきます。しかし、私の問題は、クリックBackspaceしたときにカウントアップすることですが、数値を減らす必要があります。どうすれば検討できBackspaceますか?

tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        i++;
        tv.setText(String.valueOf(i) + " / " + String.valueOf(charCounts));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

36
無関係であることをお許しください。しかし、質問のフォーマットで「バックスペース」をどのように配置したか知りたいですか。私は、その手法が非常に有用であると思われる同様の質問をしました。
AlleyOOP 2014年

59
次のような<kbd> </ kbd>タグの間に単語(この場合はBackspace)を配置します。<kbd> Backspace </ kbd>
Hesam

2
興味深いフォーマット(「バックスペース」など)が表示された場合は、いつでも[編集]リンクをクリックして、作成者のフォーマットを確認できます。次に、「キャンセル」をクリックして編集を破棄します。
Suragch 2016年

回答:


142

使用する

s.length()

以下は答えの1つでかつて提案されましたが、非常に非効率的です

textMessage.getText().toString().length()


28

あなたのコードの少しの変更:

TextView tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        tv.setText(String.valueOf(s.toString().length()));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

1
これは記述どおりには機能しません-length()はintを返し、setTextは文字列を期待します
Martin Lockett

1
@MartinLockettは、Integer.toString(int_type)を使用して文字列をintに変換します。
Mehdi Rostami 2016年

6

これはやや一般的な答えであり、将来の視聴者のためのより多くの説明があります。

テキスト変更リスナーを追加する

テキストが変更された後にテキストの長さを検索したり、何か他のことをしたい場合は、テキスト変更リスナーを編集テキストに追加できます。

EditText editText = (EditText) findViewById(R.id.testEditText);
editText.addTextChangedListener(new TextWatcher() {

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

    }

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

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

リスナーが必要TextWatcher:オーバーライドする3つのメソッドを必要とするbeforeTextChangedonTextChangedafterTextChanged

文字を数える

あなたはonTextChangedまたはbeforeTextChangedで 文字数を得ることができます

charSequence.length()

またはとafterTextChanged一緒に

editable.length()

メソッドの意味

パラメータは少しわかりにくいので、ここで少し補足説明します。

beforeTextChanged

beforeTextChanged(CharSequence charSequence, int start, int count, int after)

  • charSequence:これは、保留中の変更が行われる前のテキストコンテンツです。変更しないでください。
  • start:これは、新しいテキストが挿入される場所のインデックスです。範囲が選択されている場合、それは範囲の開始インデックスです。
  • count:これは、置換される選択されたテキストの長さです。何も選択されていない場合は、にcountなります0
  • after:これは挿入されるテキストの長さです。

onTextChanged

onTextChanged(CharSequence charSequence, int start, int before, int count)

  • charSequence:これは変更後のテキストコンテンツです。ここでこの値を変更しないでください。必要に応じて、editableinを変更しafterTextChangedます。
  • start:これは、新しいテキストが挿入された場所の開始のインデックスです。
  • before:これは古い値です。置換されたのは、以前に選択されたテキストの長さです。これは、同じ値であるcountの中でbeforeTextChanged
  • count:これは挿入されたテキストの長さです。これは、同じ値であるafterの中でbeforeTextChanged

afterTextChanged

afterTextChanged(Editable editable)

のようにonTextChanged、これはすでに変更が行われた後に呼び出されます。ただし、テキストは変更される可能性があります。

  • editable:これはの編集可能なテキストですEditText。ただし、変更する場合は、無限ループに入らないように注意する必要があります。詳細については、ドキュメントを参照してください。

この回答の補足画像

ここに画像の説明を入力してください


0

TextWatcher maritalStatusTextWatcher = new TextWatcher(){@Override public void beforeTextChanged(CharSequence charSequence、int i、int i1、int i2){

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        try {
            if (charSequence.length()==0){
                topMaritalStatus.setVisibility(View.GONE);
            }else{
                topMaritalStatus.setVisibility(View.VISIBLE);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.