如何在android中根据内容大小增加文本视图大小?

如何在android中根据内容大小增加文本视图大小?,android,textview,Android,Textview,嗨,我是android新手,在我的应用程序中,我使用了Textview来显示数据 这里我的问题是我的文本视图文本来自服务器,我的意思是,有时是大文本,有时是小文本 当出现大文本时,Textview文本不会显示所有数据 下面是我的代码,我也分享了我的屏幕 请帮我拿一个 我的代码:- 我是在网上得到这段代码的,它不是我自己创建的,这是AutoResizeTextView的代码,它会根据文本长度调整文本大小,效果非常好 package com.example.eminosoft.audiocalc

嗨,我是android新手,在我的应用程序中,我使用了Textview来显示数据

这里我的问题是我的文本视图文本来自服务器,我的意思是,有时是大文本,有时是小文本

当出现大文本时,Textview文本不会显示所有数据

下面是我的代码,我也分享了我的屏幕

请帮我拿一个

我的代码:-


我是在网上得到这段代码的,它不是我自己创建的,这是AutoResizeTextView的代码,它会根据文本长度调整文本大小,效果非常好

package com.example.eminosoft.audiocalculator;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.RectF;
import android.os.Build;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.SparseIntArray;
import android.util.TypedValue;
import android.widget.TextView;
/**
 * Created by Eminosoft on 6/24/2016.
 */
public class AutoResizeTextView extends TextView {
private interface SizeTester {
    /**
     *
     * @param suggestedSize
     *            Size of text to be tested
     * @param availableSpace
     *            available space in which text must fit
     * @return an integer < 0 if after applying {@code suggestedSize} to
     *         text, it takes less space than {@code availableSpace}, > 0
     *         otherwise
     */
    public int onTestSize(int suggestedSize, RectF availableSpace);
}

private RectF mTextRect = new RectF();

private RectF mAvailableSpaceRect;

private SparseIntArray mTextCachedSizes;

private TextPaint mPaint;

private float mMaxTextSize;

private float mSpacingMult = 1.0f;

private float mSpacingAdd = 0.0f;

private float mMinTextSize = 20;

private int mWidthLimit;

private static final int NO_LINE_LIMIT = -1;
private int mMaxLines;

private boolean mEnableSizeCache = true;
private boolean mInitiallized;

public AutoResizeTextView(Context context) {
    super(context);
    initialize();
}

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

public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initialize();
}

private void initialize() {
    mPaint = new TextPaint(getPaint());
    mMaxTextSize = getTextSize();
    mAvailableSpaceRect = new RectF();
    mTextCachedSizes = new SparseIntArray();
    if (mMaxLines == 0) {
        // no value was assigned during construction
        mMaxLines = NO_LINE_LIMIT;
    }
    mInitiallized = true;
}

@Override
public void setText(final CharSequence text, BufferType type) {
    super.setText(text, type);
    adjustTextSize(text.toString());
}

@Override
public void setTextSize(float size) {
    mMaxTextSize = size;
    mTextCachedSizes.clear();
    adjustTextSize(getText().toString());
}

@Override
public void setMaxLines(int maxlines) {
    super.setMaxLines(maxlines);
    mMaxLines = maxlines;
    reAdjust();
}

public int getMaxLines() {
    return mMaxLines;
}

@Override
public void setSingleLine() {
    super.setSingleLine();
    mMaxLines = 1;
    reAdjust();
}

@Override
public void setSingleLine(boolean singleLine) {
    super.setSingleLine(singleLine);
    if (singleLine) {
        mMaxLines = 1;
    } else {
        mMaxLines = NO_LINE_LIMIT;
    }
    reAdjust();
}

@Override
public void setLines(int lines) {
    super.setLines(lines);
    mMaxLines = lines;
    reAdjust();
}

@Override
public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();
    mMaxTextSize = TypedValue.applyDimension(unit, size,
            r.getDisplayMetrics());
    mTextCachedSizes.clear();
    adjustTextSize(getText().toString());
}

@Override
public void setLineSpacing(float add, float mult) {
    super.setLineSpacing(add, mult);
    mSpacingMult = mult;
    mSpacingAdd = add;
}

/**
 * Set the lower text size limit and invalidate the view
 *
 * @param minTextSize
 */
public void setMinTextSize(float minTextSize) {
    mMinTextSize = minTextSize;
    reAdjust();
}

private void reAdjust() {
    adjustTextSize(getText().toString());
}

private void adjustTextSize(String string) {
    if (!mInitiallized) {
        return;
    }
    int startSize = (int) mMinTextSize;
    int heightLimit = getMeasuredHeight() - getCompoundPaddingBottom()
            - getCompoundPaddingTop();
    mWidthLimit = getMeasuredWidth() - getCompoundPaddingLeft()
            - getCompoundPaddingRight();
    mAvailableSpaceRect.right = mWidthLimit;
    mAvailableSpaceRect.bottom = heightLimit;
    super.setTextSize(
            TypedValue.COMPLEX_UNIT_PX,
            efficientTextSizeSearch(startSize, (int) mMaxTextSize,
                    mSizeTester, mAvailableSpaceRect));
}

private final SizeTester mSizeTester = new SizeTester() {
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public int onTestSize(int suggestedSize, RectF availableSPace) {
        mPaint.setTextSize(suggestedSize);
        String text = getText().toString();
        boolean singleline = getMaxLines() == 1;
        if (singleline) {
            mTextRect.bottom = mPaint.getFontSpacing();
            mTextRect.right = mPaint.measureText(text);
        } else {
            StaticLayout layout = new StaticLayout(text, mPaint,
                    mWidthLimit, Alignment.ALIGN_NORMAL, mSpacingMult,
                    mSpacingAdd, true);
            // return early if we have more lines
            if (getMaxLines() != NO_LINE_LIMIT
                    && layout.getLineCount() > getMaxLines()) {
                return 1;
            }
            mTextRect.bottom = layout.getHeight();
            int maxWidth = -1;
            for (int i = 0; i < layout.getLineCount(); i++) {
                if (maxWidth < layout.getLineWidth(i)) {
                    maxWidth = (int) layout.getLineWidth(i);
                }
            }
            mTextRect.right = maxWidth;
        }

        mTextRect.offsetTo(0, 0);
        if (availableSPace.contains(mTextRect)) {
            // may be too small, don't worry we will find the best match
            return -1;
        } else {
            // too big
            return 1;
        }
    }
};

/**
 * Enables or disables size caching, enabling it will improve performance
 * where you are animating a value inside TextView. This stores the font
 * size against getText().length() Be careful though while enabling it as 0
 * takes more space than 1 on some fonts and so on.
 *
 * @param enable
 *            enable font size caching
 */
public void enableSizeCache(boolean enable) {
    mEnableSizeCache = enable;
    mTextCachedSizes.clear();
    adjustTextSize(getText().toString());
}

private int efficientTextSizeSearch(int start, int end,
                                    SizeTester sizeTester, RectF availableSpace) {
    if (!mEnableSizeCache) {
        return binarySearch(start, end, sizeTester, availableSpace);
    }
    String text = getText().toString();
    int key = text == null ? 0 : text.length();
    int size = mTextCachedSizes.get(key);
    if (size != 0) {
        return size;
    }
    size = binarySearch(start, end, sizeTester, availableSpace);
    mTextCachedSizes.put(key, size);
    return size;
}

private static int binarySearch(int start, int end, SizeTester sizeTester,
                                RectF availableSpace) {
    int lastBest = start;
    int lo = start;
    int hi = end - 1;
    int mid = 0;
    while (lo <= hi) {
        mid = (lo + hi) >>> 1;
        int midValCmp = sizeTester.onTestSize(mid, availableSpace);
        if (midValCmp < 0) {
            lastBest = lo;
            lo = mid + 1;
        } else if (midValCmp > 0) {
            hi = mid - 1;
            lastBest = hi;
        } else {
            return mid;
        }
    }
    // make sure to return last best
    // this is what should always be returned
    return lastBest;

}

@Override
protected void onTextChanged(final CharSequence text, final int start,
                             final int before, final int after) {
    super.onTextChanged(text, start, before, after);
    reAdjust();
}

@Override
protected void onSizeChanged(int width, int height, int oldwidth,
                             int oldheight) {
    mTextCachedSizes.clear();
    super.onSizeChanged(width, height, oldwidth, oldheight);
    if (width != oldwidth || height != oldheight) {
        reAdjust();
    }
}
}
package com.example.eminosoft.audiocalculator;
导入android.annotation.TargetApi;
导入android.content.Context;
导入android.content.res.Resources;
导入android.graphics.RectF;
导入android.os.Build;
导入android.text.Layout.Alignment;
导入android.text.StaticLayout;
导入android.text.TextPaint;
导入android.util.AttributeSet;
导入android.util.SparseIntArray;
导入android.util.TypedValue;
导入android.widget.TextView;
/**
*由Eminosoft于2016年6月24日创建。
*/
公共类AutoResizeTextView扩展了TextView{
专用接口SizeTester{
/**
*
*@param suggestedSize
*待测试文本的大小
*@param可用空间
*文本必须适合的可用空间
*@将{@code suggestedSize}应用于后返回一个小于0的整数
*文本,它占用的空间小于{@code availableSpace},>0
*否则
*/
公共int-onTestSize(int-suggestedSize,RectF-availableSpace);
}
private RectF mtextect=new RectF();
私有RectF mavaailablespacelect;
私人SparseIntArray mTextCachedSizes;
私人文本点;
私有浮动mMaxTextSize;
私人浮动mSpacingMult=1.0f;
私人浮动mSpacingAdd=0.0f;
专用浮点数mMinTextSize=20;
私人国际私人有限公司;
私有静态最终整数无线限制=-1;
私人互联网;
私有布尔值mEnableSizeCache=true;
私有布尔极小化;
公共AutoResizeTextView(上下文){
超级(上下文);
初始化();
}
公共AutoResizeTextView(上下文、属性集属性){
超级(上下文,attrs);
初始化();
}
公共AutoResizeTextView(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
初始化();
}
私有void初始化(){
mPaint=newtextpaint(getPaint());
mmaxtsize=getTextSize();
mavaailablespacelect=new RectF();
mTextCachedSizes=新的SparseIntArray();
如果(mMaxLines==0){
//在构建过程中未分配任何值
mMaxLines=无线路限制;
}
最小化=真;
}
@凌驾
public void setText(最终字符序列文本,BufferType){
super.setText(文本,类型);
adjustTextSize(text.toString());
}
@凌驾
公共void setTextSize(浮动大小){
mmaxtsize=大小;
mTextCachedSizes.clear();
adjustTextSize(getText().toString());
}
@凌驾
公共void setMaxLines(int maxlines){
super.setMaxLines(maxlines);
mMaxLines=最大线;
重新调整();
}
公共int getMaxLines(){
返回mMaxLines;
}
@凌驾
公共无效设置单行(){
super.setSingleLine();
mMaxLines=1;
重新调整();
}
@凌驾
公共无效设置单线(布尔单线){
超级设置单线(单线);
如果(单线){
mMaxLines=1;
}否则{
mMaxLines=无线路限制;
}
重新调整();
}
@凌驾
公共无效设置行(整数行){
超级设置行(行);
mMaxLines=直线;
重新调整();
}
@凌驾
公共void setTextSize(整数单位,浮点大小){
Context c=getContext();
资源r;
如果(c==null)
r=Resources.getSystem();
其他的
r=c.getResources();
mmaxtsize=TypedValue.applyDimension(单位、大小、,
r、 getDisplayMetrics());
mTextCachedSizes.clear();
adjustTextSize(getText().toString());
}
@凌驾
公共void设置行间距(浮动添加、浮动多个){
super.setlinespace(添加,多个);
mSpacingMult=mult;
mSpacingAdd=添加;
}
/**
*设置较低的文本大小限制并使视图无效
*
*@param minTextSize
*/
公共void setMinTextSize(浮点minTextSize){
mMinTextSize=minTextSize;
重新调整();
}
私人空间重新调整{
adjustTextSize(getText().toString());
}
私有void adjustTextSize(字符串){
如果(!迷你化){
返回;
}
int startSize=(int)mMinTextSize;
int heightLimit=getMeasuredHeight()-getCompoundPaddingBottom()
-getCompoundPaddingTop();
mWidthLimit=getMeasuredWidth()-getCompoundPaddingLeft()
-getCompoundPaddingRight();
mavaailablespacelect.right=mWidthLimit;
MavaailableSpacelect.bottom=高度限制;
super.setTextSize(
TypedValue.COMPLEX\u UNIT\u PX,
EfficientExtSizeSearch(起始尺寸,(内部)mm最大尺寸,
msizetter,mavaailable(等);
}
private final SizeTester mSizeTester=新SizeTester(){
@TargetApi(Build.VERSION\u code.JELLY\u BEAN)
@凌驾
公共int-onTestSize(int-suggestedSize,RectF-availableSPace){
mPaint.setTextSize(建议大小);
字符串text=getText().toString();
布尔单线=getMaxLines()==1;
如果(单线){
mtextect.bottom=mPaint.getFontSpacing();
mtextect.right=mPaint.measureText(文本);
}否则{
StaticLayout=新的StaticLayout(文本、mPaint、,
mWidthLimit,Alignment.ALIGN_NORMAL,mSpacingMult,
mSpacingAdd,正确);
//如果我们有更多的线路,早点回来
package com.example.eminosoft.audiocalculator;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.RectF;
import android.os.Build;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.SparseIntArray;
import android.util.TypedValue;
import android.widget.TextView;
/**
 * Created by Eminosoft on 6/24/2016.
 */
public class AutoResizeTextView extends TextView {
private interface SizeTester {
    /**
     *
     * @param suggestedSize
     *            Size of text to be tested
     * @param availableSpace
     *            available space in which text must fit
     * @return an integer < 0 if after applying {@code suggestedSize} to
     *         text, it takes less space than {@code availableSpace}, > 0
     *         otherwise
     */
    public int onTestSize(int suggestedSize, RectF availableSpace);
}

private RectF mTextRect = new RectF();

private RectF mAvailableSpaceRect;

private SparseIntArray mTextCachedSizes;

private TextPaint mPaint;

private float mMaxTextSize;

private float mSpacingMult = 1.0f;

private float mSpacingAdd = 0.0f;

private float mMinTextSize = 20;

private int mWidthLimit;

private static final int NO_LINE_LIMIT = -1;
private int mMaxLines;

private boolean mEnableSizeCache = true;
private boolean mInitiallized;

public AutoResizeTextView(Context context) {
    super(context);
    initialize();
}

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

public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initialize();
}

private void initialize() {
    mPaint = new TextPaint(getPaint());
    mMaxTextSize = getTextSize();
    mAvailableSpaceRect = new RectF();
    mTextCachedSizes = new SparseIntArray();
    if (mMaxLines == 0) {
        // no value was assigned during construction
        mMaxLines = NO_LINE_LIMIT;
    }
    mInitiallized = true;
}

@Override
public void setText(final CharSequence text, BufferType type) {
    super.setText(text, type);
    adjustTextSize(text.toString());
}

@Override
public void setTextSize(float size) {
    mMaxTextSize = size;
    mTextCachedSizes.clear();
    adjustTextSize(getText().toString());
}

@Override
public void setMaxLines(int maxlines) {
    super.setMaxLines(maxlines);
    mMaxLines = maxlines;
    reAdjust();
}

public int getMaxLines() {
    return mMaxLines;
}

@Override
public void setSingleLine() {
    super.setSingleLine();
    mMaxLines = 1;
    reAdjust();
}

@Override
public void setSingleLine(boolean singleLine) {
    super.setSingleLine(singleLine);
    if (singleLine) {
        mMaxLines = 1;
    } else {
        mMaxLines = NO_LINE_LIMIT;
    }
    reAdjust();
}

@Override
public void setLines(int lines) {
    super.setLines(lines);
    mMaxLines = lines;
    reAdjust();
}

@Override
public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();
    mMaxTextSize = TypedValue.applyDimension(unit, size,
            r.getDisplayMetrics());
    mTextCachedSizes.clear();
    adjustTextSize(getText().toString());
}

@Override
public void setLineSpacing(float add, float mult) {
    super.setLineSpacing(add, mult);
    mSpacingMult = mult;
    mSpacingAdd = add;
}

/**
 * Set the lower text size limit and invalidate the view
 *
 * @param minTextSize
 */
public void setMinTextSize(float minTextSize) {
    mMinTextSize = minTextSize;
    reAdjust();
}

private void reAdjust() {
    adjustTextSize(getText().toString());
}

private void adjustTextSize(String string) {
    if (!mInitiallized) {
        return;
    }
    int startSize = (int) mMinTextSize;
    int heightLimit = getMeasuredHeight() - getCompoundPaddingBottom()
            - getCompoundPaddingTop();
    mWidthLimit = getMeasuredWidth() - getCompoundPaddingLeft()
            - getCompoundPaddingRight();
    mAvailableSpaceRect.right = mWidthLimit;
    mAvailableSpaceRect.bottom = heightLimit;
    super.setTextSize(
            TypedValue.COMPLEX_UNIT_PX,
            efficientTextSizeSearch(startSize, (int) mMaxTextSize,
                    mSizeTester, mAvailableSpaceRect));
}

private final SizeTester mSizeTester = new SizeTester() {
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public int onTestSize(int suggestedSize, RectF availableSPace) {
        mPaint.setTextSize(suggestedSize);
        String text = getText().toString();
        boolean singleline = getMaxLines() == 1;
        if (singleline) {
            mTextRect.bottom = mPaint.getFontSpacing();
            mTextRect.right = mPaint.measureText(text);
        } else {
            StaticLayout layout = new StaticLayout(text, mPaint,
                    mWidthLimit, Alignment.ALIGN_NORMAL, mSpacingMult,
                    mSpacingAdd, true);
            // return early if we have more lines
            if (getMaxLines() != NO_LINE_LIMIT
                    && layout.getLineCount() > getMaxLines()) {
                return 1;
            }
            mTextRect.bottom = layout.getHeight();
            int maxWidth = -1;
            for (int i = 0; i < layout.getLineCount(); i++) {
                if (maxWidth < layout.getLineWidth(i)) {
                    maxWidth = (int) layout.getLineWidth(i);
                }
            }
            mTextRect.right = maxWidth;
        }

        mTextRect.offsetTo(0, 0);
        if (availableSPace.contains(mTextRect)) {
            // may be too small, don't worry we will find the best match
            return -1;
        } else {
            // too big
            return 1;
        }
    }
};

/**
 * Enables or disables size caching, enabling it will improve performance
 * where you are animating a value inside TextView. This stores the font
 * size against getText().length() Be careful though while enabling it as 0
 * takes more space than 1 on some fonts and so on.
 *
 * @param enable
 *            enable font size caching
 */
public void enableSizeCache(boolean enable) {
    mEnableSizeCache = enable;
    mTextCachedSizes.clear();
    adjustTextSize(getText().toString());
}

private int efficientTextSizeSearch(int start, int end,
                                    SizeTester sizeTester, RectF availableSpace) {
    if (!mEnableSizeCache) {
        return binarySearch(start, end, sizeTester, availableSpace);
    }
    String text = getText().toString();
    int key = text == null ? 0 : text.length();
    int size = mTextCachedSizes.get(key);
    if (size != 0) {
        return size;
    }
    size = binarySearch(start, end, sizeTester, availableSpace);
    mTextCachedSizes.put(key, size);
    return size;
}

private static int binarySearch(int start, int end, SizeTester sizeTester,
                                RectF availableSpace) {
    int lastBest = start;
    int lo = start;
    int hi = end - 1;
    int mid = 0;
    while (lo <= hi) {
        mid = (lo + hi) >>> 1;
        int midValCmp = sizeTester.onTestSize(mid, availableSpace);
        if (midValCmp < 0) {
            lastBest = lo;
            lo = mid + 1;
        } else if (midValCmp > 0) {
            hi = mid - 1;
            lastBest = hi;
        } else {
            return mid;
        }
    }
    // make sure to return last best
    // this is what should always be returned
    return lastBest;

}

@Override
protected void onTextChanged(final CharSequence text, final int start,
                             final int before, final int after) {
    super.onTextChanged(text, start, before, after);
    reAdjust();
}

@Override
protected void onSizeChanged(int width, int height, int oldwidth,
                             int oldheight) {
    mTextCachedSizes.clear();
    super.onSizeChanged(width, height, oldwidth, oldheight);
    if (width != oldwidth || height != oldheight) {
        reAdjust();
    }
}
}
dependencies {
    compile 'me.grantland:autofittextview:0.2.+'
}
<me.grantland.widget.AutofitTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:maxLines="2"
    android:textSize="40sp"
    autofit:minTextSize="16sp"
    />
xmlns:autofit="http://schemas.android.com/apk/res-auto"