我正在使用数据绑定,看起来像标签项从数据绑定返回null(但不是游戏类型),这是正常的吗?其他视图工作正常,因此数据绑定的实现没有问题。这是布局文件的一部分。
<android.support.design.widget.TabLayout
android:id="@+id/gameTypes"
android:layout_width="0dp"
android:layout_height="48dp"
android:background="@android:color/white"
>
<android.support.design.widget.TabItem
android:id="@+id/football"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="football"
android:text="Football"
/>
<android.support.design.widget.TabItem
android:id="@+id/basketball"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="basketball"
android:text="Basketball"/>
</android.support.design.widget.TabLayout>
以下是我正在尝试查找所选标签的代码;
private Boolean isSelectedTab(TabItem item, TabLayout.Tab tab) {
if (tab.getTag().equals(item.getTag()))
return true;
return false;
}
错误是; item为null,即databinding.basketball
。我认为不应该是null,因为它是TabItem
。
感谢。
答案 0 :(得分:3)
您的代码不符合您的XML,因此这可能是一个问题。但是您可能遇到了TabLayouts
和数据绑定的问题。
根本原因似乎是TabLayout在XML中使用TabItem
,但它在运行时将其转换为Tab
。这搞砸了内部映射数据绑定用于创建其引用。在我们的例子中,我们的TabItem
实例是从错误的对象转换而来的。在你的情况下,听起来它可能只是一个空对象。
在任何一种情况下,似乎都不能可靠地使用TabLayout
数据绑定。我们最终创建了一个自定义View
,它只包含TabLayout
,然后&#34;绑定&#34;通过直接访问Tab
项来手动获取数据。
例如,带有TabLayout
的布局:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="viewModel" type="com.app.ViewModel" />
</data>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
app:onTabSelectedListener="@{viewModel.onTabSelectedListener}">
<android.support.design.widget.TabItem
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/custom_tab_layout">
</android.support.design.widget.TabItem>
<android.support.design.widget.TabItem
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/custom_tab_layout">
</android.support.design.widget.TabItem>
</android.support.design.widget.TabLayout>
然后是一个包含它的自定义视图:
public class CustomTabLayout extends FrameLayout {
private CustomTabLayoutBinding mBinding;
public CustomTabLayout(@NonNull Context context) {
this(context, null);
}
public CustomTabLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomTabLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
LayoutInflater inflater = LayoutInflater.from(context);
View tabLayout = inflater.inflate(R.layout.custom_tab_layout, this, false);
addView(tabLayout);
if (!isInEditMode()) {
mBinding = CustomTabLayoutBinding.bind(tabLayout);
}
}
public void setViewModel(@Nullable ViewModel viewModel) {
mBinding.setViewModel(viewModel);
if (viewModel != null) {
updateTabAtIndex(viewModel.getFirstTabViewModel(), 0, viewModel.getSelectedIndex());
updateTabAtIndex(viewModel.getSecondTabViewModel(), 1, viewModel.getSelectedIndex());
}
}
private void updateTabAtIndex(TabViewModel tabViewModel, int index, int selectedIndex) {
TabLayout.Tab tab = mBinding.tabLayout.getTabAt(index);
if (tab == null) {
return;
}
View customView = tab.getCustomView();
if (customView == null) {
return;
}
if (index == selectedIndex) {
tab.select();
}
TextView textView = (TextView) customView.findViewById(R.id.title);
textView.setText(tabViewModel.getTitleText());
TextView subTitleTV = (TextView) customView.findViewById(R.id.subtitle);
subTitleTV.setText(tabViewModel.getSubTitleText());
}
}
然后在需要TabLayout的布局中,改为使用自定义视图:
<com.app.CustomTabLayout
android:id="@+id/custom_tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="@dimen/default_toolbar_elevation"
app:viewModel="@{viewModel.getTabsViewModel}" />
我们在这里使用MVVM,但希望您能获得要点:通过提供公共setViewModel
(或setMyData
或其他)方法,您仍然可以利用数据绑定来使用自定义标签布局,然后控制手动设置Tab
中TabLayout
个对象的属性。
希望有所帮助!
答案 1 :(得分:0)
item是databinding.itemBasketball
不符合您的代码段。您的代码段显示您正在调用itemFootballTypes
。您的问题中的布局XML中没有任何名为itemFootball
的内容。但是有一个<div class="colWrap">
<input type="button" id="Submit" value="Submit" onclick="deny(); approve(); info();">
<button id="p_users"></button>
<button id="msg_sent"></button>
</div>
<br />
<br />
<!-- <div class="col1"> -->
<div id="usersTable" ></div>
<div id="replyTable" style = "display: none;"> </div>
<!-- </div> -->
</div>
标签。