数据绑定返回null。这是正常的吗?

时间:2017-08-29 23:21:59

标签: android data-binding tabs android-tablayout android-databinding

我正在使用数据绑定,看起来像标签项从数据绑定返回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

感谢。

2 个答案:

答案 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或其他)方法,您仍然可以利用数据绑定来使用自定义标签布局,然后控制手动设置TabTabLayout个对象的属性。

希望有所帮助!

答案 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> 标签。