Justify text in an Android app using a WebView but presenting a TextView-like interface?

后端 未结 6 632
别那么骄傲
别那么骄傲 2020-11-29 02:27

I\'m looking for a simple way to forget that I\'m using a WebView to have justified text in my TextView. Has someone made a custom view for this? I

6条回答
  •  误落风尘
    2020-11-29 02:56

    This is the same JustifiedTextView class given by Juan (and edited by me), but extended to work with custom xml attributes you can use in your layout xml files. Even Eclipse layout editor will show your custom attributes in the attribute table, which is cool. I put this into an additional answer, in case you want to keep things clean and don't need xml attributes.

    public class JustifiedTextView extends WebView{
        private String core      = "%s";
        private String text;
        private int textColor;
        private int backgroundColor;
        private int textSize;
    
        public JustifiedTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(attrs);
        }
    
        public JustifiedTextView(Context context, AttributeSet attrs, int i) {
            super(context, attrs, i);
            init(attrs);
        }
    
        @SuppressLint("NewApi")
        public JustifiedTextView(Context context, AttributeSet attrs, int i, boolean b) {
            super(context, attrs, i, b);
            init(attrs);
        }
    
        private void init(AttributeSet attrs) { 
            TypedArray a=getContext().obtainStyledAttributes(
                     attrs,
                     R.styleable.JustifiedTextView);
    
            text = a.getString(R.styleable.JustifiedTextView_text);
            if(text==null) text="";
            textColor = a.getColor(R.styleable.JustifiedTextView_textColor, Color.BLACK);
            backgroundColor = a.getColor(R.styleable.JustifiedTextView_backgroundColor, Color.TRANSPARENT);
            textSize = a.getInt(R.styleable.JustifiedTextView_textSize, 12);
    
            a.recycle();
    
            this.setWebChromeClient(new WebChromeClient(){});
            reloadData();
        }
    
        public void setText(String s){
            if(s==null)
                this.text="";
            else
                this.text = s;
            reloadData();
        }
    
        @SuppressLint("NewApi")
        private void reloadData(){
    
            if(text!=null) {
                String data = String.format(core,toRgba(textColor),textSize,text);
                Log.d("test", data);
                this.loadDataWithBaseURL(null, data, "text/html","utf-8", null);
            }
    
            // set WebView's background color *after* data was loaded.
            super.setBackgroundColor(backgroundColor);
    
            // Hardware rendering breaks background color to work as expected.
            // Need to use software renderer in that case.
            if(android.os.Build.VERSION.SDK_INT >= 11)
                this.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
        }
    
        public void setTextColor(int hex){
            textColor = hex; 
            reloadData();
        }
    
        public void setBackgroundColor(int hex){
            backgroundColor = hex;
            reloadData();
        }
    
        public void setTextSize(int textSize){
            this.textSize = textSize;
            reloadData();
        }
    
        private String toRgba(int hex) {
            String h = Integer.toHexString(hex);
            int a = Integer.parseInt(h.substring(0, 2),16);
            int r = Integer.parseInt(h.substring(2, 4),16);
            int g = Integer.parseInt(h.substring(4, 6),16);
            int b = Integer.parseInt(h.substring(6, 8),16);
            return String.format("%d,%d,%d,%d", r, g, b, a); 
        }
    }
    

    Either add this as justified_text_view_attr.xml into your res/values/ folder, or merge it into your existing attrs.xml:

                                                                                   
                                                                                                              
                                                                             
                                                             
                                                                       
                                                                 
                                                                        
        
                             
    

    Feel free to edit if you find any bugs.

提交回复
热议问题