У меня есть TextView. Я хочу добавить текст к нему.
У меня есть 3 варианта текста: длинный, средний и короткий.
Я хочу использовать самый длинный подходящий текст, который может вписаться в ширину нарисованного вида.
Я подумал вычислить ширину вида в onPreRender()
и проверить, подходит ли самый длинный текст.
однако, ширина слушателя актуальна только тогда, когда видимость видна - но пока я не вызову 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);
}