0

Office や Google Docs がこの機能に異なる単語サイズを入力できるようにしようとしています

これが私のコードです

input =(EditText)findViewById(R.id.Input_EditText); 
input.addTextChangedListener(new TextWatcher() 
{
    public void onTextChanged(CharSequence s, int start, int before, int count) {   
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {    
    }
    public void afterTextChanged(Editable s) 
    {
        int index = input.getSelectionEnd();
        String nowstr;

        if(index==0)
        {
            //do nothing
        }
        else
        {
            nowstr = s.toString();
            char nowstr_array[] = nowstr.toCharArray();
            show_input = String.valueOf(nowstr_array[index-1]);

            SpannableStringBuilder  spann = new SpannableStringBuilder(show_input);
            AbsoluteSizeSpan word_size = new AbsoluteSizeSpan(40,true);
            spann.setSpan(word_size, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            input.getText().insert(index, spann);
        }
    }
});

しかし、このプログラムはクラッシュします...

それから、私はやろうとします

Toast.makeText(MainActivity.this, spann, Toast.LENGTH_SHORT).show();
//input.getText().insert(index, spann);

しかし、そうすると表示できます...

それが理由です?

4

3 に答える 3

1

メソッド aftertextchanged では、テキストを取得してテキスト サイズを変更し、最後にテキストを edittext に挿入しますが、メソッドによって textWatcher リスナーが発生し、aftertextchanged が実行され、このメソッドでテキストも変更されるため、これはデッド ループになります。ただし、トーストを使用すると、テキストが挿入されず、リスナーが発生しなくなり、機能します:)

于 2015-11-02T03:16:42.640 に答える
0

まず、画面には次のように表示されます

ここに画像の説明を入力

単語は再び小さくて大きな単語に表示されます。この時点では、私が望むものではありません。十分な大きさが欲しいだけです。

次に削除キーを押すと、プログラムがクラッシュします

これが私のコードです:

SpannableStringBuilder  spann = new SpannableStringBuilder(show_input);
spann.setSpan(new AbsoluteSizeSpan(40,true), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Toast.makeText(MainActivity.this, Integer.toString(index), Toast.LENGTH_SHORT).show();
input.removeTextChangedListener(this) ; 
input.getText().insert(index, spann);
input.addTextChangedListener(this) ;
于 2015-11-02T08:18:30.763 に答える
0
public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            beforeText = s.toString() ;
        }

        public void afterTextChanged(Editable s) {
            int index = input.getSelectionEnd();
            String nowstr;

            if (index == 0) {
                // do nothing
            } else {
                if (beforeText.length() < s.toString().length()) {
                    nowstr = s.toString();
                    char nowstr_array[] = nowstr.toCharArray();
                    String show_input = String.valueOf(nowstr_array[index - 1]);

                    SpannableStringBuilder spann = new SpannableStringBuilder(
                            show_input);
                    AbsoluteSizeSpan word_size = new AbsoluteSizeSpan(40, true);
                    spann.setSpan(word_size, 0, 1,
                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    input.removeTextChangedListener(this) ;
                    input.getText().replace(index-1, index, spann) ;
                    input.addTextChangedListener(this) ;

                }
            }
        }

    });

beforeText はグローバル変数です

于 2015-11-02T08:41:39.723 に答える