AndroidStudio 3.2.1生成的ViewDataBindingclass分包中包含视图布局数据变量类型时报错
Generated ViewDataBinding class in Android Studio 3.2.1 has an error when view layout data variable type is contained in a subpackage
我的视图模型包含在 "ViewModels" 包中。在我的片段布局 xml 文件中将其中之一设置为数据变量类型时,生成的 ViewDataBinding class 会尝试将包作为文件导入。
例如:
import com.xyz.myapp.ViewModels;
而不是:
import com.xyz.myapp.ViewModels.*;
然后它继续将视图模型引用为 ViewModels.MyFragmentViewModel
导致进一步的错误。我发现一个解决方法是将我所有的视图模型文件放在我的 com.xyz.myapp 目录中。这样做时一切正常。
这与询问的相同 我没有足够的声誉来发表评论。我错过了什么吗?我需要设置一些选项吗?或者这只是一个错误?
TestFragment.java
public class TestFragment extends Fragment {
@Inject
MyViewModelFactory viewModelFactory;
private MyFragmentViewModel vm;
public TestFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vm = ViewModelProviders.of(this, viewModelFactory).get(MyFragmentViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
FragmentTestBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false);
View view = binding.getRoot();
binding.setVm(vm);
return view;
}
@Override
public void onAttach(Context context) {
AndroidSupportInjection.inject(this);
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
}
}
fragment_test.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="vm"
type="com.xyz.myapp.ViewModels.MyFragmentViewModel"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="@{vm.TEMP}" />
</LinearLayout>
</layout>
MyFragmentViewModel.java
public class MyFragmentViewModel extends ViewModel {
public MyFragmentViewModel (){}
public String TEMP = "TEST STRING";
}
FragmentTestBinding.java
这是生成的class。错误行有注释。 4个错误
import com.xyz.myapp.ViewModels; //Error
public abstract class FragmentTestBinding extends ViewDataBinding {
@NonNull
public final CheckBox checkBox;
@NonNull
public final EditText editText;
@Bindable
protected ViewModels.ProfileViewModel mVm; //Error
protected FragmentTestBinding(DataBindingComponent _bindingComponent, View _root,
int _localFieldCount, CheckBox checkBox, EditText editText) {
super(_bindingComponent, _root, _localFieldCount);
this.checkBox = checkBox;
this.editText = editText;
}
public abstract void setVm(@Nullable ViewModels.ProfileViewModel vm); //Error
@Nullable
public ViewModels.ProfileViewModel getVm() { //Error
return mVm;
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup root, boolean attachToRoot) {
return inflate(inflater, root, attachToRoot, DataBindingUtil.getDefaultComponent());
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup root, boolean attachToRoot, @Nullable DataBindingComponent component) {
return DataBindingUtil.<FragmentTestBinding>inflate(inflater, com.camapps.linkshare.R.layout.fragment_test, root, attachToRoot, component);
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, DataBindingUtil.getDefaultComponent());
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater,
@Nullable DataBindingComponent component) {
return DataBindingUtil.<FragmentTestBinding>inflate(inflater, com.camapps.linkshare.R.layout.fragment_test, null, false, component);
}
public static FragmentTestBinding bind(@NonNull View view) {
return bind(view, DataBindingUtil.getDefaultComponent());
}
public static FragmentTestBinding bind(@NonNull View view,
@Nullable DataBindingComponent component) {
return (FragmentTestBinding)bind(component, view, com.camapps.linkshare.R.layout.fragment_test);
}
}
编译器输出
Java compiler: (4 errors)
C:/Users/user/AndroidStudioProjects/myapp
app/build/generated/data_binding_base_class_source_out/debug/dataBindingGenBaseClassesDebug/out
com/xyz/myapp/databinding/FragmentTestBinding.java
error: cannot find symbol class ViewModels
error: package ViewModels does not exist
error: package ViewModels does not exist
error: package ViewModels does not exist
这是一个有趣的问题,表明需要遵循约定。如Android - Package Name convention、
所述
Android follows normal java package conventions
和 Oracle suggests 那
Package names are written in all lower case to avoid conflict with the names of classes or interfaces.
现在 Android 数据绑定库 或另一个依赖库试图创建干净的代码并认为 class 名称是 ViewModels.ProfileViewModel
, 遵循并期待一般的 Java 命名约定。
要解决您的问题,请开始遵循给定的约定并将您的包重命名为 viewmodels
。
我的视图模型包含在 "ViewModels" 包中。在我的片段布局 xml 文件中将其中之一设置为数据变量类型时,生成的 ViewDataBinding class 会尝试将包作为文件导入。 例如:
import com.xyz.myapp.ViewModels;
而不是:
import com.xyz.myapp.ViewModels.*;
然后它继续将视图模型引用为 ViewModels.MyFragmentViewModel
导致进一步的错误。我发现一个解决方法是将我所有的视图模型文件放在我的 com.xyz.myapp 目录中。这样做时一切正常。
这与询问的相同
TestFragment.java
public class TestFragment extends Fragment {
@Inject
MyViewModelFactory viewModelFactory;
private MyFragmentViewModel vm;
public TestFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vm = ViewModelProviders.of(this, viewModelFactory).get(MyFragmentViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
FragmentTestBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false);
View view = binding.getRoot();
binding.setVm(vm);
return view;
}
@Override
public void onAttach(Context context) {
AndroidSupportInjection.inject(this);
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
}
}
fragment_test.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="vm"
type="com.xyz.myapp.ViewModels.MyFragmentViewModel"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="@{vm.TEMP}" />
</LinearLayout>
</layout>
MyFragmentViewModel.java
public class MyFragmentViewModel extends ViewModel {
public MyFragmentViewModel (){}
public String TEMP = "TEST STRING";
}
FragmentTestBinding.java
这是生成的class。错误行有注释。 4个错误
import com.xyz.myapp.ViewModels; //Error
public abstract class FragmentTestBinding extends ViewDataBinding {
@NonNull
public final CheckBox checkBox;
@NonNull
public final EditText editText;
@Bindable
protected ViewModels.ProfileViewModel mVm; //Error
protected FragmentTestBinding(DataBindingComponent _bindingComponent, View _root,
int _localFieldCount, CheckBox checkBox, EditText editText) {
super(_bindingComponent, _root, _localFieldCount);
this.checkBox = checkBox;
this.editText = editText;
}
public abstract void setVm(@Nullable ViewModels.ProfileViewModel vm); //Error
@Nullable
public ViewModels.ProfileViewModel getVm() { //Error
return mVm;
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup root, boolean attachToRoot) {
return inflate(inflater, root, attachToRoot, DataBindingUtil.getDefaultComponent());
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup root, boolean attachToRoot, @Nullable DataBindingComponent component) {
return DataBindingUtil.<FragmentTestBinding>inflate(inflater, com.camapps.linkshare.R.layout.fragment_test, root, attachToRoot, component);
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, DataBindingUtil.getDefaultComponent());
}
@NonNull
public static FragmentTestBinding inflate(@NonNull LayoutInflater inflater,
@Nullable DataBindingComponent component) {
return DataBindingUtil.<FragmentTestBinding>inflate(inflater, com.camapps.linkshare.R.layout.fragment_test, null, false, component);
}
public static FragmentTestBinding bind(@NonNull View view) {
return bind(view, DataBindingUtil.getDefaultComponent());
}
public static FragmentTestBinding bind(@NonNull View view,
@Nullable DataBindingComponent component) {
return (FragmentTestBinding)bind(component, view, com.camapps.linkshare.R.layout.fragment_test);
}
}
编译器输出
Java compiler: (4 errors)
C:/Users/user/AndroidStudioProjects/myapp
app/build/generated/data_binding_base_class_source_out/debug/dataBindingGenBaseClassesDebug/out
com/xyz/myapp/databinding/FragmentTestBinding.java
error: cannot find symbol class ViewModels
error: package ViewModels does not exist
error: package ViewModels does not exist
error: package ViewModels does not exist
这是一个有趣的问题,表明需要遵循约定。如Android - Package Name convention、
所述Android follows normal java package conventions
和 Oracle suggests 那
Package names are written in all lower case to avoid conflict with the names of classes or interfaces.
现在 Android 数据绑定库 或另一个依赖库试图创建干净的代码并认为 class 名称是 ViewModels.ProfileViewModel
, 遵循并期待一般的 Java 命名约定。
要解决您的问题,请开始遵循给定的约定并将您的包重命名为 viewmodels
。