选项卡主机布局和数据绑定



我读到了关于安卓数据绑定的信息,想在我的应用程序中使用它, 但我在 xml 布局阶段失败了。

我有这样的activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/tab1"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
</layout>

和选项卡 1.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
<EditText
...

我想将数据绑定应用于最后一个EditText,但是如果我插入

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<TabHost>
...

这导致

activity_main.xml:9: AAPT: Error parsing XML: duplicate attribute

问题是,我应该如何绑定数据绑定和TabHost以在包含的布局中绑定EditText

这是带有问题代码的存储库

这是你的提示XML: duplicate attribute.它甚至在错误消息中告诉您一个行号,9,大致在 TabHost 元素中。

现在,哪个 XML 属性是重复的?命名空间 (xmlns:android(

删除布局标记中不在 XML 最顶部元素的那个

问题出在xmlns:android

只需从中删除此xmlns:android="http://schemas.android.com/apk/res/android"即可完成。

关于DataBinding,我认为除了那个标签之外,你甚至没有实现它

<data>activity_main.xml

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

使用随附的布局传递它

<include layout="@layout/tab1"
app:name="@{name}"/>

现在在您的tab1.xml中捕获这些数据

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="name"
type="String"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edit1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_column="1"
android:layout_row="0"
android:ems="1"
android:inputType="text"
android:text="@{name}" />
</LinearLayout>
</layout>

您几乎完成了,现在您只需要在您的活动中实现绑定

ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.setName("Email Address");

我在这里可以看到两个错误,您使用xmlns命名空间两次,tab1id 两次。删除一个命名空间,然后更改 id。

<LinearLayout
android:id="@+id/tab1" /* you used tab1 here as id*/
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/tab1"/> /* you used tab1 here as id */

最新更新