4

有没有办法找出要放置在 TextView 中的文本内容是否适合单行?

我想要实现的内容显示在附加的图像中(它是 listView 的一部分)。问题涉及textView#3. 如果它太大,我想把它放在下面textView#2,但如果内容足够短,我想把它放在右边textView#2(看到的场景row#3是我想逃避的)

那么,有人吗?.. 我该如何解决这个特殊问题?我想象这无法通过我的列表视图行的单一布局来实现..

在此处输入图像描述

4

4 回答 4

2

有可能的。您应该测量文本大小并将其与 TextView 大小进行比较。如果文本宽度 > textView 宽度比它太长。

您可以从这篇文章中了解文本测量。

您也可以使用 TextView 的内置功能,使其成为单行并设置文本椭圆大小的方法。

于 2013-01-10T08:23:33.737 回答
0

一个解决方案(不是一个漂亮的解决方案)是对您的字符串在 textView 中占用的空间进行一些数学运算。在我的特殊情况下,我添加了 2 个 textViews (3 & 3B) & 取决于我的数学计算结果 - 我会只使用一个并隐藏另一个。

细节:

  1. 在适配器的 getView 方法中找出父 listView 的宽度

    public View getView(int position, View convertView, ViewGroup parent) { int listViewWidth = parent.getWidth();

  2. 计算放置在同一行中的其他 textViews 占用的空间(在我的例子中只是 textView2);

    油漆油漆 = textViewX.getPaint(); occupiedWidth = (int) (occupiedWidth +paint.measureText("要放置在 textview 中的文本"));

  3. 比较要放置在最后一个 textview 中的文本占用的空间(在我的 screenShot textView3 中,计算宽度的公式相同)并与剩余空间进行比较(listViewWidth - occupiedWidth

  4. 在正确的 textView 上设置文本并隐藏另一个
  5. ..根据需要改进代码

新版面 结果

于 2013-01-11T09:44:24.223 回答
0

没有内置功能可以比较它。

在做了很多研究和代码之后,我已经建立了自己的函数来做到这一点......

1)将此代码复制到您的项目中



import android.app.Activity;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.widget.TextView;

public class TextMeasure {


    public static boolean isTextCanFitInTextView(TextView textView, String txt , float allowWidthInDp , Activity activity){

        String backupText = textView.getText().toString();

        textView.setText(txt);
        textView.measure(0, 0);       //must call measure!
        float textViewSize_px = textView.getMeasuredWidth(); //get width in px

        // Converts dip into its equivalent px
        float dip = allowWidthInDp;
        Resources r = activity.getResources();
        float allowView_px = TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                dip,
                r.getDisplayMetrics()
        );

        //restore textView
        textView.setText(backupText);

        return textViewSize_px <= allowView_px;
    }


    public static boolean isTextCanFitInTextView_matchParent(TextView textView, String txt , float totalMarginInDp, Activity activity){

        String backupText = textView.getText().toString();

        textView.setText(txt);
        textView.measure(0, 0);       //must call measure!
        float textViewSize_px = textView.getMeasuredWidth(); //get width in px

        // Converts dip into its equivalent px
        float dip = totalMarginInDp;
        Resources r = activity.getResources();
        float totalMarginInDp_px = TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                dip,
                r.getDisplayMetrics()
        );

        float allowView_px;
        float window_length;

        window_length = getDisplayWidthInPixel(activity);

        allowView_px = window_length - totalMarginInDp_px;

        //re store textView
        textView.setText(backupText);

        return textViewSize_px <= allowView_px;
    }

    private static float getDisplayWidthInPixel(Activity activity){
        DisplayMetrics metrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        return  metrics.widthPixels;
    }




}

2)使用上面的类方法来做你的 text 和 textView 比较,例如:

1)知道确切的宽度,android:layout_width="300dp"


 TextView yourTextView = findViewById(R.id.txt);
        float widthOfTextView_inDp = 300f;      // width of textView Size in dp (densityPixel) , what you set in xml view

        String yourTxt = "your text need to display in single line";

        if (TextMeasure.isTextCanFitInTextView(yourTextView,yourTxt,widthOfTextView_inDp,this)){
            // text can fit in to text View
            yourTextView.setText(yourTxt);

        }else {
            // text can't fit in to text View

            // add your logic
        }

2) match_parent 用来设置宽度。

android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:layout_width="match_parent"


 TextView yourTextView = findViewById(R.id.txt);
        float totalMargin_inDp = 20f;      // width of text view is match_parent and (marginStart = 10dp), (marginEnd = 10dp) = 20dp, note: it is total margin from both end of mobile screen combine.

        String yourTxt = "your text need to display in single line";

        if (TextMeasure.isTextCanFitInTextView_matchParent(yourTextView,yourTxt,totalMargin_inDp,this)){
            // text can fit in to text View
            yourTextView.setText(yourTxt);

        }else {
            // text can't fit in to text View

            // add your logic
        }


于 2021-08-20T13:21:25.990 回答
-2

试试textview的这个属性

android:maxLength="number of characters you want to display in textview"

现在在 Activity 中检查字符串长度是否大于 maxLength,而不是更改视图的位置。

于 2013-01-10T10:30:12.363 回答