提问人:Sk1X1 提问时间:9/24/2023 更新时间:9/25/2023 访问量:28
具有动态添加内容的 ViewBinding
ViewBinding with dynamically added content
问:
我有基本活动为我的应用程序的每个屏幕实现一些功能。然后,每个子活动都会使用其 XML 布局覆盖方法。
BaseActivity(基础活动)
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.base_screen);
View mFormView = findViewById(R.id.pnContent);
if (getContentAreaLayoutId() != 0) {
LayoutInflater inflater = LayoutInflater.from(this);
View contentLayout = inflater.inflate(getContentAreaLayoutId(), (ViewGroup) mFormView, false);
((ViewGroup) mFormView).addView(contentLayout, 0);
}
}
儿童活动
override fun getContentAreaLayoutId(): Int = R.layout.standard_content_settings
现在,我想在我的子活动中使用视图绑定。我在想这样的事情:
override fun onCreate(savedInstanceState: Bundle?) {
val binding = StandardContentSettingsBinding.inflate(layoutInflater)
}
但是当我使用绑定()时,视图不会改变并保持为空。我想我错误地使用了视图绑定,并且必须用另一种方式膨胀它?binding.edURL.setText("test")
答:
1赞
marcinj
9/25/2023
#1
可以在 中扩充绑定对象,并向子活动公开方法以获取绑定对象。BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
//base binding
private BaseScreenBinding baseBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // always call base methods, your code didnt have those calls.
baseBinding = BaseScreenBinding.inflate(getLayoutInflater());
setContentView(baseBinding.getRoot());
//your existing code to inflate child content
View mFormView = baseBinding.pnContent;
if (getContentAreaLayoutId() != 0) {
LayoutInflater inflater = LayoutInflater.from(this);
View contentLayout = inflater.inflate(getContentAreaLayoutId(), (ViewGroup) mFormView, false);
((ViewGroup) mFormView).addView(contentLayout, 0);
}
}
protected BaseScreenBinding getBaseBinding() {
return baseBinding;
}
protected abstract int getContentAreaLayoutId();
}
您现在可以在子 Activity 中使用 ViewBinding,您的布局被 BaseActivity 膨胀,在子 Activity 中,您将绑定到它。
class ChildActivity : BaseActivity() {
private lateinit var binding: StandardContentSettingsBinding
override fun getContentAreaLayoutId(): Int = R.layout.standard_content_settings
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Layout was inflated in BaseActivity, so now only bind to it.
binding = StandardContentSettingsBinding.bind(getBaseBinding().pnContent)
//This should work now
binding.edURL.setText("test")
}
}
在子活动中,调用 不同于 ,因为它不会创建新的视图层次结构,而是使用现有的视图层次结构,在这种情况下,这是您想要的。StandardContentSettingsBinding.bind(View)
inflate()
一些参考资料: https://developer.android.com/topic/libraries/data-binding/generated-binding
评论
binding.root
<include>