Включить TextView и переопределить текст - PullRequest
32 голосов
/ 03 февраля 2012

У меня есть TextView, который я использую в качестве заголовка моей страницы меню:

<TextView
  android:id="@+id/menuTextView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Menu"
  android:textColor="@color/white"
  android:textSize="25sp"
  android:textStyle="bold" />

Теперь мне нужно TextView с тем же цветом, размером и стилем для каждого подменю в моем приложении. Вместо того, чтобы копировать и вставлять весь TextView в каждый макет и просто менять текст в каждом, я подумал, что я сделаю один макет с TextView и включу его в каждый вид подменю, только переопределяя текст.

Мой код выглядит так:

/ макет / menutextview.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/menuTextView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/default"
  android:textColor="@color/white"
  android:textSize="25sp"
  android:textStyle="bold" />

Включения в каждом файле макета XML пытаются переопределить атрибут текста:

<include layout="@layout/menutextview" android:text="@string/menu" />

<include layout="@layout/menutextview" android:text="@string/settings" />

Но текст по умолчанию отображается везде. У кого-нибудь есть идея, в чем может быть проблема?

С уважением, Маттиас

Ответы [ 4 ]

19 голосов
/ 03 февраля 2012

Добро пожаловать в StackOverflow;)

Включить нельзя использовать для "переопределения" дочерних свойств.Он не знает, какой тип макета вы включите, он только раздувает его и добавляет к текущему макету.

Чтобы динамически изменить текст, вам нужно сделать это в коде.

final TextView textView1 = (TextView) findViewById(R.id.menuTextView);
textView1.setText(R.string.menu);

final TextView textView2 = (TextView) findViewById(R.id.settingsTextView);
textView2.setText(R.string.settings);
14 голосов
/ 03 февраля 2012

Попробуйте использовать стили, и TextView реализует этот стиль. Это облегчит поддержание согласованности в ваших представлениях.

4 голосов
/ 02 октября 2018

Этого можно добиться с помощью DataBinding .Сначала вы определяете переменную в вашем дочернем макете:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
                name="buttonText"
                type="String" />
    </data>

        <android.support.v7.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{buttonText}"/>
</layout>

Затем вы устанавливаете ее в другом файле макета, куда вы ее включаете:

<!-- .... other views -->
<include
    layout="@layout/inc_icon_button"
    bind:buttonText="@{`Put your String here`}" />
<!-- .... other views -->

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

0 голосов
/ 19 февраля 2019

Вы можете использовать следующее решение:

  1. Присвойте тегу включения и TextView в макете включения определенный идентификатор (например, "section")
  2. Объявите тег включения какпредставление и TextView в вашем коде View section; и TextView textview;
  3. Привязка просмотра с идентификатором вашего включения section = findViewById(R.id.section);
  4. Привязка TextView вашего включения с View.findViewById();

textview = section.findViewById(R.id.textview);

Я использовал информацию этой стороны.

...