如何在MainActivity.kt中调用Waves.kt内的函数?
解决方案
首先明确核心问题:你想调用的clear()函数操作的是Waves类实例的成员变量(amplitudes、spikes)和实例方法(invalidate()),这类函数不能直接通过类名Waves.clear()调用,必须通过Waves的具体实例对象调用。
步骤1:修正Waves.kt中的函数定义
确保clear()是Waves类的实例成员函数(因为要操作实例状态),完整代码示例:
class Waves(context: Context, attrs: AttributeSet?) : View(context, attrs) { // 假设这是你的实例变量定义 private var amplitudes = ArrayList<Float>() private var spikes = ArrayList<Any>() // 根据实际业务替换类型 // 定义实例成员函数clear() fun clear(): ArrayList<Float> { val amps = amplitudes.clone() as ArrayList<Float> amplitudes.clear() spikes.clear() invalidate() return amps } }
步骤2:在MainActivity.kt中调用函数
先获取Waves的实例(通常从布局中获取),再调用其clear()方法:
class MainActivity : AppCompatActivity() { private lateinit var wavesView: Waves override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 从布局中找到Waves控件实例 wavesView = findViewById(R.id.waves_view) // 调用实例的clear()方法 amplitudes = wavesView.clear() } }
为什么不能用Waves.clear()?
如果强行要通过类名调用,需要把amplitudes、spikes改成静态变量,同时处理invalidate()的调用逻辑,但这违背了Android View组件的状态管理设计——每个View实例都有自己的状态,静态变量会导致所有Waves实例共享同一状态,大概率不符合你的业务需求。
内容的提问来源于stack exchange,提问作者Islamic Clips
相关产品推荐
相关产品推荐

