Ответ 1
Сохраняйте свой атрибут textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Определите свою строку в файле string.xml
<string name="Username"> aaaaaaa\/bb\nbb\-ccccc\/d\ndd</string>
В моем приложении Android у меня есть текстовое представление, которое отображает текст, содержащий специальные символы. TextView каким-то образом автоматически разбивает строки на символы '/' и '-'.
Например, строка "aaaaaaa/bbb-ccccc/ddd" отображается как
aaaaaaa/
bbb-
ccccc/
ddd
Однако я хотел бы отображать его без каких-либо строк, кроме тех, которые находятся на границах представления, т.е. вот так:
aaaaaaa/bb
bb-ccccc/d
dd
Есть ли способ отключить автоматические разрывы или избежать этих символов? Я уже пробовал убегать с \uFEFF без успеха.
Сохраняйте свой атрибут textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Определите свою строку в файле string.xml
<string name="Username"> aaaaaaa\/bb\nbb\-ccccc\/d\ndd</string>
Возможно, это решение: fooobar.com/questions/610623/...
Я добавил косую черту:
public class WordBreakTransformationMethod extends ReplacementTransformationMethod {
private static WordBreakTransformationMethod instance;
private WordBreakTransformationMethod() {}
public static WordBreakTransformationMethod getInstance() {
if (instance == null) {
instance = new WordBreakTransformationMethod();
}
return instance;
}
private static char[] dash = new char[]{'-', '\u2011'};
private static char[] space = new char[]{' ', '\u00A0'};
private static char[] slash = new char[]{'/', '\u2215'};
private static char[] original = new char[]{dash[0], space[0], slash[0]};
private static char[] replacement = new char[]{dash[1], space[1], slash[1]};
@Override
protected char[] getOriginal() {
return original;
}
@Override
protected char[] getReplacement() {
return replacement;
}
}
вы, вероятно, можете использовать атрибут Lines или его метод встречной части setLines (целое)
Нет готового решения и нет такой вещи, как "обертывание текста буквами в TextView", единственный способ сделать это в хорошем смысле - это расширить TextView и изменить Paint breakText (текст строки, логический метод forwards, float maxWidth, float [ ] measuredWidth).
Кроме того, вы можете рассчитать размер TextView в пикселях, рассчитать ширину одной буквы в пикселях, затем найти количество букв (X), которые будут вписываться в одну строку, а затем вставить строку после каждой буквы X
Я проверил следующий код. Вы можете даже преобразовать его в функцию:
String specialString = "a/b/-c/d-d";
String[] specialArray = specialString.split("/");
String str = "";
for(int i = 0; i < specialArray.length - 1; i++){
str = str + specialArray[i] + Character.toString((char) 47);
}
str = str + specialArray[specialArray.length - 1];
specialArray = str.split("-");
str = "";
for(int i = 0; i < specialArray.length - 1; i++){
str = str + specialArray[i] + Character.toString((char) 45);
}
str = str + specialArray[specialArray.length - 1];
textView.setText(str);
Теперь текст не выходит
Вы можете рассчитать размер текста таким образом:
String text = "This is my text";
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(14.0f);
Rect bounds = new Rect();
textPaint.getTextBounds(text, 0, text.length(), bounds);
bounds.width() // width in pixels
bounds.height() // height in pixels
На основе этих значений вы можете разбить текст на части и вставить символы новой строки.
Это новая вещь в Android 6.
Попробуйте добавить это в макет xml TextView
android:hyphenationFrequency="none"
это работа для меня в Котлине
object WordBreakTransformationMethod : ReplacementTransformationMethod() {
private val dash = charArrayOf('-', '\u2011')
private val space = charArrayOf(' ', '\u00A0')
private val slash = charArrayOf('/', '\u2215')
private val original = charArrayOf(dash[0], space[0], slash[0])
private val replacement = charArrayOf(dash[1], space[1], slash[1])
override fun getOriginal() = original
override fun getReplacement() = replacement
}
//tv_text is TextView
tv_text.apply {
transformationMethod = WordBreakTransformationMethod
text = item.text
}
Вы можете попробовать следующее:
"aaaaaaa"+"/"+"bbb-ccccc"+"/"+"ddd"