简体   繁体   English

Android Edittext富文本格式

[英]Android Edittext Rich Text Formatting

Is there any library or open source application demo that contains Rich Text Format Edittext component with WYSIWYG interface. 是否有任何库或开源应用程序演示包含带有WYSIWYG接口的RTF格式Edittext组件。 I've heard that android-richtexteditor contained such functionality, but it's source code is no longer available. 我听说android-richtexteditor包含这样的功能,但它的源代码不再可用。

If anyone have a link or source to the above please share it with me. 如果有人有上述链接或来源,请与我分享。

Here are two awesome libraries which helped me out. 这里有两个很棒的图书馆帮助了我。 Both of them are implementation of WYSIWYG. 它们都是WYSIWYG的实现。

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

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

Their implementation code is also provided. 还提供了他们的实现代码。

No there is no library for this but you can do that with using following classes 没有没有这个库,但你可以使用以下类来做到这一点

1.HTML 1.HTML

2.SPANNABLE 2.SPANNABLE

3.ForegroundSpan 3.ForegroundSpan

4.BackgroundSpan 4.BackgroundSpan

5.AbsoluteSpan 5.AbsoluteSpan

1. http://developer.android.com/reference/android/text/Html.html 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 使用这个你可以嵌入直接html标签与android像粗体,itlic,underlince等

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

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 http://www.androidengineer.com/2010/08/easy-method-for-formatting-android.html

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

Here is the steps to convert an EditText into RichText 以下是将EditText转换为RichText的步骤

1) Create a RichTextEditor class as shown below, this example has support for bold/unbold, you can add more as needed 1)创建一个RichTextEditor类,如下所示,这个例子支持bold / unbold,你可以根据需要添加更多

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 2)创建以下ResourceHelper类

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 3)使用edittext和控制按钮(ImageButtons)创建布局,如下所示

   <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 4)在Activity中,加载edittext并创建RichTextEditor实例,如下所示

inputText = (EditText)findViewById(R.id.text_content) ;
new RichTextEditor(this,inputText);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM