片段中的 Android 数据绑定 - IllegalArgumentException:未找到视图

Ove*_*olt 4 android

我有一个包含回收视图的片段。这个 recyclerview 使用数据绑定绑定到我的视图模型。

问题; 我在尝试启动片段时遇到以下异常:

FATAL EXCEPTION: main
Process: no.inforte.demo, PID: 3134
    java.lang.IllegalArgumentException: No view found for id 0x7f0d0074 (no.inforte.demo:id/content_frame) for fragment CategoryListFragment2{6db9671 #1 id=0x7f0d0074 CATEGORYLISTFRAGMENT}
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1059)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

该错误正确地表明“content_frame”不存在。该视图位于 MainActivity.java 类的布局中,作为我的片段容器。

由于我使用数据绑定,因此我使用 DataBindingUtil.setContentView 方法:

private void initDataBinding() {
    Log.d(TAG, "initDataBinding");
    mCategoryListFragmentBinding = DataBindingUtil.setContentView(getActivity(), R.layout.category_list_fragment);
    mCategoryListViewModel = new CategoryListViewModel(mCategoryListView, getContext());
    mCategoryListFragmentBinding.setCategoryListViewModel(mCategoryListViewModel);
}
Run Code Online (Sandbox Code Playgroud)

如何解决?

更多信息:

这就是我从 MainActivity 启动此片段的方式:

CategoryListFragment2 categoryListFragment = new CategoryListFragment2();
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.content_frame, categoryListFragment, FRAGMENT_TAG_CATEGORYLIST)
            .commit();
getSupportFragmentManager().executePendingTransactions();
Run Code Online (Sandbox Code Playgroud)

这是我的片段布局:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="no.inforte.demo.ui.fragment.CategoryListFragment2">

    <data>
        <variable
            name="categoryListViewModel"
            type="no.inforte.demo.ui.viewmodel.CategoryListViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/category_list"
                android:name="no.inforte.demo.ui.fragment.CategoryListFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="50dp"
                android:layout_marginLeft="@dimen/activity_horizontal_margin"
                android:layout_marginRight="@dimen/activity_horizontal_margin"
                app:layoutManager="LinearLayoutManager"
                tools:context="no.inforte.demo.ui.fragment.CategoryListFragment"
                tools:listitem="@layout/rowlayout_category_list">

        </android.support.v7.widget.RecyclerView>
    </RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

小智 5

我也遇到了这个问题,并使用 DataBindingUtil.inflate 方法找到了解决方案。您所做的一切都是正确的,除了您的 initDataBinding 方法应被删除并替换如下:

在您的片段类(扩展 Fragment 的类)中,您需要重写 onCreateView 方法并执行以下操作:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    CategoryListFragmentBinding binding = DataBindingUtil.inflate(inflater, R.layout.category_list_fragment , container, false);
    binding.setViewModel(new CategoryListViewModel());
    return binding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您的数据绑定将正常工作,您就可以开始了!