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

时间:2016-03-22 15:06:04

标签: android

我有一个包含recyclerview的片段。此recyclerview使用数据绑定绑定到我的viewmodel。

问题;尝试启动片段时出现以下异常:

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)
    ...
    ...

错误正确表明'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);
}

如何解决?

更多信息:

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

CategoryListFragment2 categoryListFragment = new CategoryListFragment2();
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.content_frame, categoryListFragment, FRAGMENT_TAG_CATEGORYLIST)
            .commit();
getSupportFragmentManager().executePendingTransactions();

这是我的片段布局:

<?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>

2 个答案:

答案 0 :(得分:1)

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

在你的片段类(扩展片段的那个)中,你需要覆盖onCreateView方法并执行此操作:

@IBAction func tagLocationBtn(_ sender: Any) {
    var annotationArray = [MKAnnotation]()
    let annotation = MKPointAnnotation()
    var coordinate: CLLocationCoordinate2D?

    if myLatitude != nil && myLongitude != nil {
        ref?.child("Latitude").childByAutoId().setValue(myLatitude)
        ref?.child("Longitude").childByAutoId().setValue(myLongitude)
    }


    if latitude != nil && longitude != nil {
        coordinate = CLLocationCoordinate2DMake(latitude!, longitude!)
        annotation.coordinate = coordinate!
        annotationArray.append(annotation)
        mapView.addAnnotations(annotationArray)
    }

一旦你这样做,你的数据绑定将正常工作,你很高兴!

答案 1 :(得分:0)

在您共享的上述代码中找不到片段oncreateview。想想你还没有添加它,尝试在你刚刚在initDataBinding中创建的数据绑定视图中返回父视图。