dar*_*uby 159 android android-fragments android-databinding
我正在尝试从官方谷歌文档https://developer.android.com/tools/data-binding/guide.html关注数据绑定示例
除了我试图将数据绑定应用于片段,而不是活动.
编译时我目前得到的错误是
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate 对于片段看起来像这样:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
Run Code Online (Sandbox Code Playgroud)
onCreateView 对于片段看起来像这样:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
Run Code Online (Sandbox Code Playgroud)
我的片段布局文件的部分内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="marsdata"
type="uk.co.darkruby.app.myapp.MarsDataProvider" />
</data>
...
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@{marsdata.martianSols}"
/>
</RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
我怀疑是MartianDataBinding不知道它应该绑定哪个布局文件 - 因此错误.有什么建议?
小智 305
数据绑定实现必须在片段的onCreateView方法中,删除OnCreate方法中存在的任何数据Binding,onCreateView应如下所示:
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
MartianDataBinding binding = DataBindingUtil.inflate(
inflater, R.layout.martian_data, container, false);
View view = binding.getRoot();
//here data must be an instance of the class MarsDataProvider
binding.setMarsdata(data);
return view;
}
Run Code Online (Sandbox Code Playgroud)
Til*_*ill 48
实际上,我们鼓励您使用inflate生成的Binding方法,而不是DataBindingUtil:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
MainFragmentBinding binding = MainFragmentBinding.inflate(inflater, container, false);
//set variables in Binding
return binding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)
仅当layoutId事先未知时才使用此版本.否则,使用生成的Binding的膨胀方法来确保类型安全的膨胀.
Khe*_*raj 12
即使其他答案也可能运作良好,但我想告诉最佳方法.
Binding class's inflate按照Android文档中的建议使用.一种选择是通过膨胀,DataBindingUtil 但只有你不知道生成了绑定类.
- 你有自动生成binding class,使用该类而不是使用DataBindingUtil.
在Java中
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
HomeFragmentBinding binding = HomeFragmentBinding.inflate(inflater, container, false);
//set binding variables here
return binding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)
在科特林
lateinit var binding: HomeFragmentBinding
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = HomeFragmentBinding.inflate(inflater, container, false)
return binding.root
}
Run Code Online (Sandbox Code Playgroud)
在DataBindingUtil类文档中,您可以看到.
膨胀
Run Code Online (Sandbox Code Playgroud)T inflate (LayoutInflater inflater, int layoutId, ViewGroup parent, boolean attachToParent)仅当layoutId事先未知时才使用此版本.否则,使用生成的Binding的膨胀方法来确保类型安全的膨胀.
如果未生成布局biniding类,请参阅此答案.
Lef*_*fty 11
正如大多数人所说,但不要忘记在 Java 中设置LifeCycleOwner
Sample,
即
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
BindingClass binding = DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false);
ModelClass model = ViewModelProviders.of(getActivity()).get(ViewModelClass.class);
binding.setLifecycleOwner(getActivity());
binding.setViewmodelclass(model);
//Your codes here
return binding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是ViewModel和LiveData,这是足够的语法
Kotlin语法:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return MartianDataBinding.inflate(
inflater,
container,
false
).apply {
setLifecycleOwner(this@MartianData)
vm = viewModel // Attach your view model here
}.root
}
Run Code Online (Sandbox Code Playgroud)
小智 8
在Android DataBinding中试试这个
FragmentMainBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false);
View rootView = binding.getRoot();
initInstances(savedInstanceState);
return rootView;
}
Run Code Online (Sandbox Code Playgroud)
可以简单地检索视图对象,如下所述
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = DataBindingUtil.inflate(inflater, R.layout.layout_file, container, false).getRoot();
return view;
}
Run Code Online (Sandbox Code Playgroud)
数据绑定片段中的完整示例
FragmentMyProgramsBinding 是为 res/layout/fragment_my_programs 生成的绑定类
public class MyPrograms extends Fragment {
FragmentMyProgramsBinding fragmentMyProgramsBinding;
public MyPrograms() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
FragmentMyProgramsBinding fragmentMyProgramsBinding = DataBindingUtil.inflate(inflater, R
.layout.fragment_my_programs, container, false);
return fragmentMyProgramsBinding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
在我的代码中工作.
private FragmentSampleBinding dataBiding;
private SampleListAdapter mAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
dataBiding = DataBindingUtil.inflate(inflater, R.layout.fragment_sample, null, false);
return mView = dataBiding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)
Kotlin语法:
lateinit var binding: MartianDataBinding
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.martian_data, container, false)
return binding.root
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84476 次 |
| 最近记录: |