2011-01-19 3 views
0

В основном, что я хочу сделать в своем приложении для Android, TextView отображает сразу две разные части текста. Так в коде, я хочу, чтобы иметь возможность сделать что-то вроде этого:Динамическое отображение текста с помощью TextView (Android)

LinearLayout ll = new LinearLayout(this); 
    TextView text = new TextView(this); 
    text.setTextColor(0xFF000000); 
    text.setGravity(Gravity.CENTER_HORIZONTAL); 
    text.setTextSize(20f); 
    text.setText("Text1"); 
    text.setTextSize(14f); 
    text.setColor(0xFF0000FF); 
    text.setText("\nText2"); 
    ll.addView(text); 

Чтобы уточнить, я пытаюсь отобразить черный «Text1» и синий «Text2» на один раз, используя только один TextView. Очевидно, это не работает с использованием приведенного выше кода. Я рассмотрел использование второго TextView, но это кажется пустой тратой усилий и памяти для меня. Я уверен, что блестящие умы здесь могут придумать лучшее решение этого.

Благодарим вас за ваше время и вашу помощь.

ответ

3

Есть два варианта для вас.

Один

Spannable

и другой

fromHtml (String source)

Так что вы можете получить желаемый результат.

+0

Простой и прямой. Только то, что мне было нужно. Благодарю. –

0

Кажется, проблема с:

LinearLayout.addView(text); 

Вы пытаетесь добавить представление к LinearLayout, но расположение не существует (в текущей деятельности). Вам нужно добавить TextView в макет, определенный в используемом XML-файле. Предположим, у вас есть LinearLayout с идентификатором «linearlayout01» в XML-файле «activity1.xml», вы могли бы сделать что-то вроде:

setContentView(R.layout.activity1); 

// Create and adjust TextView text 

... 

LinearLayout layout = (LinearLayout) findViewById(R.id.linearlayout01); 
layout.addView(text); 
+0

Нет, вы совершенно меня неправильно поняли. Вероятно, это моя вина; У меня был общий размер моего кода. Я исправлю вопрос. Предположим, что LinearLayout существует, а затем снова просмотрите мой вопрос. Моя проблема заключается не в том, что текст не появляется, моя проблема меняет текст динамически. –

0

После View добавляют к ViewGroup которого LinearLayout является потомком вы не необходимо прочитать его, чтобы обновить его отображение. Если вы преформируете какие-либо изменения в представлении, требующем изменения его отображения, он будет обрабатывать все надлежащие уведомления о необходимых перерисованиях или ретрансляциях, позвонив, если это необходимо, View#invalidate и View#requestLayout.

Кроме того, поскольку все изменения пользовательского интерфейса обрабатываются в одном потоке, вам не нужно беспокоиться о вызове нескольких методов, которые будут обновлять пользовательский интерфейс. Это связано с двумя причинами: во-первых, выполнение перерисовки не произойдет до тех пор, пока ваш код не будет завершен, во-вторых, у android есть встроенные оптимизаторы, которые объединяют несколько недействительных вызовов в один.

Итак, единственное, о чем вам нужно беспокоиться, это получить правильную ссылку на ваш экземпляр TextView, а затем вы можете вызвать все методы на нем, которые вам нужно, чтобы они отображали то, что вы хотите.

Поскольку вы создаете ваши View S вручную и не из XML вам нужно добавить корень ViewGroup к Activity по телефону Activity#setContentView.

Edit:

Тогда вы будете нуждаться, чтобы узнать о SpannableString и SpannableStringBuilder. Существует некоторая очень краткая документация: Selecting, Highlighting, or Styling Portions of Text

+0

Нет, ты меня не понимаешь. Вероятно, это моя вина, я постараюсь разобраться в этом вопросе. Я хочу отображать два разных типа текста в одном рендере, а не в нескольких визуализаторах. С кодом, который я написал выше, отображается только «Text2». Я хочу иметь возможность отображать как «Text1», так и «Text2» –

+0

. Информация о SpannableString должна быть тем, что вы ищете. – Qberticus

+0

Если у вас есть какие-либо ссылки, которые вы могли бы предоставить мне, я бы очень признателен. Благодарю. –

0

Когда вы планируете обновить textview? Если он нажал кнопку, то получите ссылку на textview и в onClickListener() обновите текст, цвет и т. Д., Что бы вы ни хотели сделать.

после просмотра других комментариев, я думаю, что SpannableString является то, что вы ищете

+0

Вы вообще не понимаете мой вопрос. Извините, это, должно быть, моя вина. Я не пытаюсь нарисовать текст, а затем изменить его позже после возникновения события. Это легко;) Я пытаюсь сделать два разных фрагмента текста одновременно в том же TextView. –

+0

После просмотра ваших других комментариев, я думаю, SpannableString - это то, что вы ищете. См. Http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/text/Link.html для примера – pankajagarwal

+0

Напротив, холод всегда использует 2 текстовых изображения для достижения вашей задачи :) – pankajagarwal

1

Я думаю, что с текущей версией кода вы можете увидеть только последний текст (текст2). Если вы хотите иметь многообразный внешний вид для двух текстов, я бы предложил использовать 2 отдельных текстовых элемента. Это добавит большей гибкости.

Если вы не собираетесь менять этот код пользовательского интерфейса позже, вы можете рассмотреть Html.toHtml() в вызове setText().

+0

Как я уже сказал в своем вопросе, я НЕ хочу использовать два TextView. Это очень расточительное и плохое решение. Я регулярно нахожу сборку RISC (главным образом, PPC и ARM) на встроенных платформах, что, вероятно, объясняет мои сильные чувства по этому вопросу. Мне действительно все равно, мой код «уродливый», пока он эффективен (также, на мой взгляд, я думаю, что все будет более гибким с меньшим количеством TextViews). Но спасибо за ваш ответ так же. –

Смежные вопросы