0

I have a weird problem, for some reason the android:ellipsize="end" works, but added the point in the middle of the text == centered vertically instead of being aligned to baseline:

enter image description here

I checked for any "center" properties, but there is none of those:

Update: This is the XML part:

 <com.citylifeapps.cups.customviews.CarmelaTextView
        android:id="@+id/venue_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/venue_distance"
        android:layout_toRightOf="@+id/venue_name"
        android:gravity="left"
        android:text="@string/placeholder_venue_address"
        android:textColor="@color/cups_white"
        android:textSize="20sp"
        android:textStyle="bold"
        android:ellipsize="end"
        android:singleLine="true"
        android:scrollHorizontally="true"
        android:layout_alignBaseline="@+id/venue_name" />

And the custom TextView class:

public class CarmelaTextView extends TextView {
public CarmelaTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setCarmelaTypeface(context);
}

public CarmelaTextView(Context context) {
    super(context);
    setCarmelaTypeface(context);
}

private void setCarmelaTypeface(Context context) {
    if (this.isInEditMode()) return;
    Typeface typeface = Typeface.createFromAsset(context.getAssets(), "carmela.ttf");
    this.setTypeface(typeface);
}
}

further check shows that if I use a simple TextView the problem disappears, but there is nothing in the custom TextView that will cause such a behavior.

Does anyone know why this might happen?

Thanks.

Emil Adz
  • 40,709
  • 36
  • 140
  • 187

2 Answers2

0

It looks like the problem lies within my custom font I'm using for this custom TextView, from the accepted answer here:

Why does TextView in single line elipsized with "end" show boxes?

I'm guessing that I'm facing the same problem but with a different result because the 3 dots (...) U+FEFF glyph for my font is different.

But still if some one found a solution that works for this issue I would be glad if he could share it.

Community
  • 1
  • 1
Emil Adz
  • 40,709
  • 36
  • 140
  • 187
0

I used this class to resolve this issue

public class EllipsizingTextView extends TextView { private static final String ELLIPSIS = "...";

public interface EllipsizeListener {
    void ellipsizeStateChanged(boolean ellipsized);
}

private final List<EllipsizeListener> ellipsizeListeners = new ArrayList<EllipsizeListener>();
private boolean isEllipsized;
private boolean isStale;
private boolean programmaticChange;
private String fullText;
private int maxLines = -1;
private float lineSpacingMultiplier = 1.0f;
private float lineAdditionalVerticalPadding = 0.0f;

public EllipsizingTextView(Context context) {
    super(context);
}

public EllipsizingTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.maxLines });
    setMaxLines(a.getInt(0, 1));
}

public EllipsizingTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.maxLines });
    setMaxLines(a.getInt(0, 1));
}

public void addEllipsizeListener(EllipsizeListener listener) {
    if (listener == null) {
        throw new NullPointerException();
    }
    ellipsizeListeners.add(listener);
}

public void removeEllipsizeListener(EllipsizeListener listener) {
    ellipsizeListeners.remove(listener);
}

public boolean isEllipsized() {
    return isEllipsized;
}

@Override
public void setMaxLines(int maxLines) {
    super.setMaxLines(maxLines);
    this.maxLines = maxLines;
    isStale = true;
}

public int getMaxLines() {
    return maxLines;
}

@Override
public void setLineSpacing(float add, float mult) {
    this.lineAdditionalVerticalPadding = add;
    this.lineSpacingMultiplier = mult;
    super.setLineSpacing(add, mult);
}

@Override
protected void onTextChanged(CharSequence text, int start, int before,
        int after) {
    super.onTextChanged(text, start, before, after);
    if (!programmaticChange) {
        fullText = text.toString();
        isStale = true;
    }
}

@Override
protected void onDraw(Canvas canvas) {
    if (isStale) {
        super.setEllipsize(null);
        resetText();
    }
    super.onDraw(canvas);
}

private void resetText() {
    int maxLines = getMaxLines();
    String workingText = fullText;
    boolean ellipsized = false;
    if (maxLines != -1) {
        Layout layout = createWorkingLayout(workingText);
        if (layout.getLineCount() > maxLines) {
            workingText = fullText.substring(0,
                    layout.getLineEnd(maxLines - 1)).trim();
            while (createWorkingLayout(workingText + ELLIPSIS)
                    .getLineCount() > maxLines) {
                workingText = workingText.substring(0,
                        workingText.length() - 1 - 1);
            }

            workingText = workingText + ELLIPSIS;
            ellipsized = true;
        }
    }
    if (!workingText.equals(getText())) {
        programmaticChange = true;
        try {
            setText(workingText);
        } finally {
            programmaticChange = false;
        }
    }
    isStale = false;
    if (ellipsized != isEllipsized) {
        isEllipsized = ellipsized;
        for (EllipsizeListener listener : ellipsizeListeners) {
            listener.ellipsizeStateChanged(ellipsized);
        }
    }
}

private Layout createWorkingLayout(String workingText) {
    return new StaticLayout(workingText, getPaint(), getWidth()
            - getPaddingLeft() - getPaddingRight(), Alignment.ALIGN_NORMAL,
            lineSpacingMultiplier, lineAdditionalVerticalPadding, false);
}

@Override
public void setEllipsize(TruncateAt where) {
    // Ellipsize settings are not respected
}

}