所以我有这个结构,我想用 viewBinding 代替 findViewById<>
替换工作代码abstract class ParentActivity: AppCompatActivity()
class ChildActivity: ParentActivity()
activity_parent.xml
是一个布局,其中包含使用下面的 setContentView
覆盖动态替换的子布局的占位符:
所以在
ParentActivity.kt
abstract class ParentActivity : AppCompatActivity()
override fun setContentView(layoutResID: Int) {
val parent = LayoutInflater.from(this).inflate(R.layout.activity_parent, null)
LayoutInflater.from(this).inflate(layoutResID, parent.findViewById(R.id.abstractViewContainer) as androidx.coordinatorlayout.widget.CoordinatorLayout, true)
super.setContentView(parent)
}
// ... Shared code
}
activity_parent.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
tools:context=".nestedActivity.ParentActivity">
<TextView
android:id="@+id/parentTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello I am Parent Activity"
/>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/abstractViewContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/parentTextView">
</LinearLayout>
ChildActivity.kt
class ChildActivity : ParentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_child)
}
}
有没有办法使用
ViewBinding
代替这里的旧解决方案?
这段代码是十多年前的了,今天我只会使用
和fragments
(或者只是撰写)但在这里我需要保留嵌套的活动架构,因为父活动对数千个其他活动的遗留影响。nav_graph
这样的解决方案:https://stackoverflow.com/a/64461332/2474454不适用于我的情况,我想根据子项动态融合 ActivityParentBinding 与 ActivityChildBinding 。
看起来那个答案很接近。我想你所需要的只是一个
ViewGroup.addView()
。
以下怎么样。 (不确定您是否真的需要示例中的
CoordinatorLayout
;如果您不需要额外的支持,可以将其替换为 FrameLayout
)
abstract class ParentActivity : AppCompatActivity() {
private lateinit var binding: ActivityParentBinding // for parent stuff
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityParentBinding.inflate(layoutInflater)
binding.abstractViewContainer.addView(createContentView()) // add the child
setContentView(binding.root)
// ...
}
abstract fun createContentView(): View
}
class ChildActivity: ParentActivity() {
private lateinit var binding: ActivityChildBinding // for child stuff
override fun createContentView(): View {
binding = ActivityChildBinding.inflate(layoutInflater)
return binding.root
}
}