我有一个包含回收视图的片段。这个 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)
完成此操作后,您的数据绑定将正常工作,您就可以开始了!