如何动态更改Android视图文本

时间:2018-08-28 20:07:57

标签: java android text layout android-viewtreeobserver

我有一个TextView。我想在上面添加一些文字。

我有3种文字版本:长,中长和短。

我想使用最长的合适文本,以适合视图绘制的宽度。

我想计算onPreRender()中的视图宽度,并检查最长的合适文本。

但是,仅当视图可见时,侦听器的宽度才有意义-直到i多次调用onPreRender

另外,我不确定我最初使用最长的文本来填充视图的最大可能宽度是正确的方法。

如果在渲染之前发生这种情况,用户将看不到文本更改,但可能仍然过于浪费GPU?

其他方法?

public class MyView<T> extends FrameLayout {


  public final android.support.design.chip.Chip myAccountView;




  public MyView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater.from(context).inflate(R.layout.account_menu_body, this, true);
    //...
  }

  public void initialize() {
   //...

    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);
  }

0 个答案:

没有答案