包含TextView并覆盖文本

Mat*_*ias 32 android overriding include textview

我有一个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" />
Run Code Online (Sandbox Code Playgroud)

现在我需要在我的应用程序的每个子菜单上使用相同颜色,大小和样式的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" />
Run Code Online (Sandbox Code Playgroud)

每个布局中的包含xml文件尝试覆盖text属性:

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

<include layout="@layout/menutextview" android:text="@string/settings" />
Run Code Online (Sandbox Code Playgroud)

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

问候,马蒂亚斯

Gui*_*ume 19

欢迎来到StackOverflow;)

Include不能用于"覆盖"子属性.它不知道您将包含哪种类型的布局,它只会使其膨胀并将其添加到当前布局.

要动态更改文本,您需要在代码中执行此操作.

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);
Run Code Online (Sandbox Code Playgroud)


Jox*_*aex 14

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


Spi*_*pau 7

您可以使用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>
Run Code Online (Sandbox Code Playgroud)

然后在包含它的其他布局文件中设置它:

<!-- .... other views -->
<include
    layout="@layout/inc_icon_button"
    bind:buttonText="@{`Put your String here`}" />
<!-- .... other views -->
Run Code Online (Sandbox Code Playgroud)

最好的情况是,您的父布局中也会有一个变量,然后只转发绑定。

  • 请注意,要使“bind”属性存在,您需要在布局标记内包含 `xmlns:bind=”http://schemas.android.com/apk/res-auto`。 (4认同)
  • 显然我无法删除我的赞成票。这个答案缺少的是:++ 父布局和包含布局的根元素必须是`&lt;layout&gt;`;++ `&lt;include&gt;` 不能是 `&lt;layout&gt;` 或 `&lt;merge&gt;` 的直接子元素;++ 你必须使用`DataBindingUtil.inflate` 或`DataBindingUtil.setContentView` 而不是普通的`LayoutInflater.inflate` 或`Activity.setContentView`。否则它很有帮助,但我花了很长时间才弄清楚为什么我的代码不起作用。 (3认同)
  • 显然我不能再编辑我的评论了。如果有人想知道如何从 `DataBindingUtil.inflate` 获取视图:`View rootView = DataBindingUtil.inflate(inflater, R.layout.my_layout, container, false).getRoot();`。 (2认同)