包含TextView并覆盖文本

时间:2012-02-03 10:19:10

标签: android include textview override

我有一个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制作一个布局并将其包含在每个子菜单视图中,只覆盖文本。

我的代码如下所示:

/layout/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" />

但是默认文本随处可见。任何人都有问题可能是什么?

此致 的Mattias

4 个答案:

答案 0 :(得分:19)

欢迎使用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);

答案 1 :(得分:14)

尝试使用样式并让TextView实现该样式。这样可以更轻松地保持视图的一致性。

答案 2 :(得分:3)

您可以使用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 -->

最好的情况是,您在父版式中还会有一个变量,然后只需转发绑定即可。

答案 3 :(得分:0)

您可以使用以下解决方案:

  1. 为include布局中的include标记和TextView提供特定的ID(例如“ section”)
  2. 在代码View section;TextView textview;中将in​​clude标记声明为视图和TextView
  3. 使用包含section = findViewById(R.id.section);的ID绑定视图
  4. 使用View.findViewById();绑定包含的TextView

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

我使用了this端的信息。