如何在Android上通过嵌套活动动态使用ViewBinding?

问题描述 投票:0回答:1

所以我有这个结构,我想用 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 。

java android kotlin android-layout viewbinding
1个回答
0
投票

看起来那个答案很接近。我想你所需要的只是一个

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.