Question

Is there any library or open source application demo that contains Rich Text Format Edittext component with WYSIWYG interface. I've heard that android-richtexteditor contained such functionality, but it's source code is no longer available.

If anyone have a link or source to the above please share it with me.

Was it helpful?

Solution

Here are two awesome libraries which helped me out. Both of them are implementation of WYSIWYG.

Android RTEditor: https://github.com/1gravity/Android-RTEditor

RichEditor-Android: https://github.com/wasabeef/richeditor-android

Their implementation code is also provided.

OTHER TIPS

No there is no library for this but you can do that with using following classes

1.HTML

2.SPANNABLE

3.ForegroundSpan

4.BackgroundSpan

5.AbsoluteSpan

1.http://developer.android.com/reference/android/text/Html.html

using this you can embedd direct html tag with android like bold ,itlic,underlince etc

2.http://developer.android.com/reference/android/text/Spannable.html (SpannableString ,SpannableStringBuilder, etc)

EDIT

for edit text bold,italic etc.. see some examples on below link

http://www.androidengineer.com/2010/08/easy-method-for-formatting-android.html

https://blog.stylingandroid.com/introduction-to-spans/

Here is the steps to convert an EditText into RichText

1) Create a RichTextEditor class as shown below, this example has support for bold/unbold, you can add more as needed

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
import android.text.TextWatcher;
import android.text.style.StyleSpan;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageButton;

import com.loa.learnandcheck.R;
import com.loa.learnandcheck.util.ResourceHelper;

public class RichTextEditor implements ImageButton.OnClickListener, TextWatcher {
    private boolean textBold;
    private ImageButton buttonBold;
    private EditText editText;
    private Activity parent;
    private int styleStart = 0;

    public RichTextEditor(Activity parent, EditText editText){
        try {
            this.parent = parent;
            this.editText = editText;
            init();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void init(){
        try {
            buttonBold = (ImageButton)parent.findViewById(R.id.text_control_text_bold);
            if(buttonBold!=null) {
                buttonBold.setOnClickListener(this);
            }
            editText.addTextChangedListener(this);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Activity getParent() {
        return parent;
    }

    public void setParent(Activity parent) {
        this.parent = parent;
    }

    public void updateBackground(boolean itemSelected, ImageButton button) {
        try {
            if(itemSelected) {
                button.setBackgroundColor(ResourceHelper.getThemeColor(parent,R.color.colorGray, Color.GRAY));
            } else {
                button.setBackgroundColor(ResourceHelper.getThemeColor(parent,R.color.colorWhite, Color.WHITE));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void handleBoldButtonClick() {
        try {
            textBold = !textBold;
            updateBackground(textBold,buttonBold);
            int selectionStart = editText.getSelectionStart();
            int selectionEnd = editText.getSelectionEnd();
            if (selectionStart > selectionEnd){
                int temp = selectionEnd;
                selectionEnd = selectionStart;
                selectionStart = temp;
            }
            if (selectionEnd > selectionStart) {
                Spannable str = editText.getText();
                StyleSpan[] ss = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
                boolean exists = false;
                for (int i = 0; i < ss.length; i++) {
                    if (ss[i].getStyle() == android.graphics.Typeface.BOLD){
                        str.removeSpan(ss[i]);
                        exists = true;
                    }
                }
                if (!exists){
                    str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void handleFormat(Editable s, int position, int format) {
        try {
            StyleSpan[] ss = s.getSpans(styleStart, position, StyleSpan.class);
            for (int i = 0; i < ss.length; i++) {
                if (ss[i].getStyle() == format){
                    s.removeSpan(ss[i]);
                }
            }
            s.setSpan(new StyleSpan(format), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View view) {
        try {
            switch (view.getId()) {
                case R.id.text_control_text_bold:
                    handleBoldButtonClick();
                    break;
                //more formats to be handled as needed here...
                default:
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void afterTextChanged(Editable s) {
        int position = Selection.getSelectionStart(editText.getText());
        //handle bold
        if (textBold){
            handleFormat(s, position, android.graphics.Typeface.BOLD);
        }
        //more formats to be handled as needed here...
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        styleStart = start;
    }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        //unused
    }

}

2) Create the following ResourceHelper class

public class ResourceHelper {
    /**
     * Get a color value from a theme attribute.
     * @param context used for getting the color.
     * @param attribute theme attribute.
     * @param defaultColor default to use.
     * @return color value
     */
    public static int getThemeColor(Context context, int attribute, int defaultColor) {
        int themeColor = 0;
        String packageName = context.getPackageName();
        try {
            Context packageContext = context.createPackageContext(packageName, 0);
            ApplicationInfo applicationInfo =
                context.getPackageManager().getApplicationInfo(packageName, 0);
            packageContext.setTheme(applicationInfo.theme);
            Resources.Theme theme = packageContext.getTheme();
            TypedArray ta = theme.obtainStyledAttributes(new int[] {attribute});
            themeColor = ta.getColor(0, defaultColor);
            ta.recycle();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return themeColor;
    }
}

3) Create layout with an edittext and control buttons(ImageButtons) as shown below

   <EditText
                android:id="@+id/text_content"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="5"
                android:inputType="textMultiLine"
                android:lines="5"
                android:scrollbars="vertical"
                android:background="@color/colorWhite"

                android:hint="@string/text_content" />


<ImageButton
                            android:id="@+id/text_control_text_bold"
                            android:layout_width="40dp"
                            android:layout_height="40dp"
                            android:background="@color/colorWhite"
                            android:src="@drawable/ic_action_text_bold"/>

4) In Activity, load the edittext and create RichTextEditor instance as show below

inputText = (EditText)findViewById(R.id.text_content) ;
new RichTextEditor(this,inputText);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top