2017-01-26 22 views
1

Android用の基本的なテキストエディタアプリケーションを作成しています。現在、テキストの書式設定に取り組んでいます。AndroidのEditTextで今後のテキストを太字に変更する

ユーザーがテキストを入力するtext_areaという名前のEditTextと、テキストを太字に設定するboldというToggleButtonがあります。最初にEditText.setTypefaceメソッドを使用すると、ボタンがオンのときにtext_areaのすべてのテキストが太字に変わります。 this questionで提供されている回答を使用して、選択したテキストのみを太字に変更できました。

私が本当にやりたいことは、ボタンを押すと以前に入力されたテキスト(通常または太字)はすべて変更されず、次のユーザーが次に入力するものは太字で入力されていることです。ここで

は(誰かがまた、elseステートメントの下のコードが何をするのかを教えてもらえ)私のコードです:

bold.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 

      if(bold.isChecked()==true) { 
       Spannable str = textarea.getText(); 
       if(textarea.getSelectionEnd() > textarea.getSelectionStart()) 
        str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 
          textarea.getSelectionStart(), textarea.getSelectionEnd(), 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       else 
        str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 
          textarea.getSelectionEnd(), 
          textarea.getSelectionStart(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
     } 
    }); 

答えて

2

私は同じ問題に引っかかって、そして試みるの時間後に、これは私が思いついたものですましたと。

最初に、適用するスタイルチェックボックスの太字/斜体をチェックするたびに、現在のカーソル位置を取得する必要があります。

//if bold is checked 
YourEditText.getSelectionStart(); 
YourEditText.getSelectionEnd(); 

テキストが強調表示されていない場合、EditTextの現在のカーソル位置が表示されます。

この値を変数に格納します。

int lastCursorPosition = YourEditText.getSelectionStart(); 

次に、EditTextのonTextChanged関数をオーバーライドします。最後のカーソル位置から変更が行われる場所の終わりまでスパンを設定したいだけなので、lastCursorPositionからテキストの終わりまでスパンを設定します。

int endOfString = YourEditText.getText().toString().length(); 
StyleSpan ss = new StyleSpan(Typeface.BOLD); 
str.setSpan(ss, lastCursorPosition, endOfString, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

このとき、別の問題が発生しました。テキストの別の部分に別のスパンを適用すると、以前のスタイルは消えてしまいました。私は新しいスタイルが適用されるたびに新しいStyleSpanを作成してこれを修正しました。理解するための最小限のコード:

public class TextArea extends EditText { 

    public static final int TYPEFACE_NORMAL = 0; 
    public static final int TYPEFACE_BOLD = 1; 
    public static final int TYPEFACE_ITALICS = 2; 
    public static final int TYPEFACE_BOLD_ITALICS = 3; 

    private int currentTypeface; 
    private int lastCursorPosition; 
    private int tId; 


    public TextArea(Context context) { 
     super(context); 
     lastCursorPosition = this.getSelectionStart(); 
    } 

    public TextArea(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 


    public int gettId() { 
     return tId; 
    } 

    public void settId(int tId) { 
     this.tId = tId; 
    } 

    public void changeTypeface(int tfId) { 
     currentTypeface = tfId; 
     lastCursorPosition = this.getSelectionStart(); 
    } 

    @Override 
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { 
     Spannable str = this.getText(); 
     StyleSpan ss; 
     int endLength = text.toString().length(); 

     switch(currentTypeface) { 
      case TYPEFACE_NORMAL: 
       ss = new StyleSpan(Typeface.NORMAL); 
       break; 
      case TYPEFACE_BOLD: 
       ss = new StyleSpan(Typeface.BOLD); 
       break; 
      case TYPEFACE_ITALICS: 
       ss = new StyleSpan(Typeface.ITALIC); 
       break; 
      case TYPEFACE_BOLD_ITALICS: 
       ss = new StyleSpan(Typeface.BOLD_ITALIC); 
       break; 
      default: 
       ss = new StyleSpan(Typeface.NORMAL); 
     } 

     str.setSpan(ss, lastCursorPosition, endLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 
} 

MainActivity.java

TextArea t = new TextArea(context); 
int typefaceStyle = TextArea.TYPEFACE_NORMAL; 
CheckBox boldCheckbox = (CheckBox) findViewById(R.id.post_bold_checkbox); 

boldCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      boldChecked = isChecked; 
      if(italicsChecked && boldChecked) { 
       typefaceStyle = TextArea.TYPEFACE_BOLD_ITALICS; 
      } else if (boldChecked){ 
       typefaceStyle = TextArea.TYPEFACE_BOLD; 
      } else if (italicsChecked) { 
       typefaceStyle = TextArea.TYPEFACE_ITALICS; 
      } else { 
       typefaceStyle = TextArea.TYPEFACE_NORMAL; 
      } 
      t.changeTypeface(typefaceStyle); 
     } 
    }); 

からStackOverflowの上の私の非常に最初の応答を:私が書いた

public static final int TYPEFACE_NORMAL = 0; 
public static final int TYPEFACE_BOLD = 1; 
public static final int TYPEFACE_ITALICS = 2; 
public static final int TYPEFACE_BOLD_ITALICS = 3; 

private int currentTypeface; 
private int lastCursorPosition; 

... 

@Override 
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { 
    Spannable str = this.getText(); 
    StyleSpan ss; 
    int endOfString = text.toString().length(); 

    //current typeface is determined by bold, italics, checkboxes, etc 
    switch(currentTypeface) { 
     case TYPEFACE_NORMAL: 
      ss = new StyleSpan(Typeface.NORMAL); 
      break; 
     case TYPEFACE_BOLD: 
      ss = new StyleSpan(Typeface.BOLD); 
      break; 
     case TYPEFACE_ITALICS: 
      ss = new StyleSpan(Typeface.ITALIC); 
      break; 
     case TYPEFACE_BOLD_ITALICS: 
      ss = new StyleSpan(Typeface.BOLD_ITALIC); 
      break; 
     default: 
      ss = new StyleSpan(Typeface.NORMAL); 
    } 

    str.setSpan(ss, lastCursorPosition, endOfString, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 

全TextAreaクラス!これが役に立ったら:-)

関連する問題