Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当a11y更改为大字体时,android视图宽度不会变大_Android_User Interface_Width_Pixel_Android Viewtreeobserver - Fatal编程技术网

当a11y更改为大字体时,android视图宽度不会变大

当a11y更改为大字体时,android视图宽度不会变大,android,user-interface,width,pixel,android-viewtreeobserver,Android,User Interface,Width,Pixel,Android Viewtreeobserver,我有一些代码可以测量android textView的宽度以及要在其中显示的文本 final ViewTreeObserver[] viewTreeObserver = {myAccountView.getViewTreeObserver()}; viewTreeObserver[0].addOnPreDrawListener( new OnPreDrawListener() { @Override public boolean o

我有一些代码可以测量android textView的宽度以及要在其中显示的文本

final ViewTreeObserver[] viewTreeObserver = {myAccountView.getViewTreeObserver()};
    viewTreeObserver[0].addOnPreDrawListener(
        new OnPreDrawListener() {
          @Override
          public boolean onPreDraw() {
            myAccountView.setText(R.string.og_my_account_desc_long_length);
            int chipWidth = myAccountView.getMeasuredWidth();
            if (chipWidth > 0) {
              setChipTextWithCorrectLength(chipWidth);
              viewTreeObserver[0] = myAccountView.getViewTreeObserver();
              if (viewTreeObserver[0].isAlive()) {
                viewTreeObserver[0].removeOnPreDrawListener(this);
              }
            }
            return true;
          }
        });
  }

  private void setChipTextWithCorrectLength(int chipWidth) {
    String desc =
        setChipTextWithCorrectLength(
            getContext().getString(R.string.og_my_account_desc_long_length),
            getContext().getString(R.string.og_my_account_desc_meduim_length),
            getContext().getString(R.string.og_my_account_desc_short_length),
            chipWidth);
    myAccountView.setText(desc);
  }

  @VisibleForTesting
  String setChipTextWithCorrectLength(
      String longDesc, String mediumDesc, String shortDesc, int clipWidth) {
    if (textWidthPixels(longDesc) > clipWidth) {
      if (textWidthPixels(mediumDesc) > clipWidth) {
        return shortDesc;
      } else {
        return mediumDesc;
      }
    }
    return longDesc;
  }

  public float textWidthPixels(String text) {
    TextPaint textPaint = myAccountView.getPaint();
    return textPaint.measureText(text);
  }
我把我的设备改成了最大的字体和最大的显示器

我在UI中看到文本被截断(省略)

但我的测量显示文本宽度(503像素)小于文本视图宽度(587像素)

怎么可能呢

我应该如何以不同的方式测量它们,以便我的代码也会指示文本宽度大于文本视图宽度

编辑:


我试图添加填充物,但没有改变。更改为a11y会截断长文本,而不是选择短文本

  public float textWidthPixels(String text) {
    TextPaint textPaint = myAccountView.getPaint();
    View parent = (View) myAccountView.getParent();
    float width = textPaint.measureText(text);

    int paddingLeft = parent.getPaddingLeft();
    int paddingRight = parent.getPaddingRight();
    return width - (paddingLeft + paddingRight);

  }
编辑:

我试着计算芯片宽度,考虑到它的填充,但仍然textSize使文本截断,而代码中的绘制尺寸比视图尺寸短

int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();

从图像中,我看到myAccountView向上扩展到圆形边缘。它的宽度跨越到圆角边缘。但是文本在左半圈结束后和右半圈开始前开始和结束。因此,应该考虑myAccountView的填充。在您的编辑中,您考虑了myAccountView父级的填充,该填充没有相关性

测量切屑宽度时,应考虑填充物

int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();

似乎已经找到了解决办法,但我想根据我的研究提出几点

int textViewWidth = textView.getMeasuredWidth();
返回文本视图的宽度,包括任何填充

对于所附文本:

  • 可以使用measureText():

    TextPaint-paint=textView.getPaint();
    int textWidth=(int)paint.measureText(textView.getText().toString())

  • 使用
    getTextBounds()

    TextPaint-paint=textView.getPaint();
    Rect bounds=new Rect();paint.getTextBounds(textView.getText().toString(),0,textView.getText().toString().length(),bounds);
    int textWidth=bounds.width()

  • 通过将填充值添加到textWidth或从textViewWidth中减去来比较这些值是比较的基础

    您也可以尝试
    textView.getLayout().getEllipsisStart(0)
    ,以防您的textView是作为比较基准的单线(而不是计算宽度)。它返回文本被截断的索引,否则返回0

    我也建议你去看看


    支持库26为安卓4.0(API级别14)和更高版本的自动大小写TeXVIEW功能提供了完全支持。

    您还应该考虑<代码>文本视图< /代码>的填充。由于文本应位于填充区域内,因此文本的可用宽度不是
    TextView.measuredWidth
    ,而是
    TextView.measuredWidth-TextView.paddingLeft-TextView.paddingRight
    。我已尝试添加填充,但没有更改。更改为a11y截断了长文本,而不是选择短文本。计算芯片宽度为“int chipWidth=myAccountView.getMeasuredWidth()-myAccountView.getPaddingLeft()-myAccountView.getPaddingRight();”@Durgadass为什么字体大小会改变视图的填充?从图像中,我看到myAccountView向上扩展到圆形边缘。它的宽度跨越到圆角边缘。但是文本在左半圈结束后和右半圈开始前开始和结束。因此,应该考虑myAccountView的填充。在您的编辑中,您考虑了myAccountView父级的填充,该填充没有相关性。