如果使用的是kotlin的语法,则可以尝试viewmodel,viewmodel有一个特点就是fragment和activity可以共用一个viewmodel,把数据的处理逻辑都写在viewmodel里,fragment和activity进行livedata数据监听就行
class HomeFragment : Fragment() {
private lateinit var binding: FragmentHomeBinding
private val model: MainViewmodel by activityViewModels()
...
/**
* 初始化viewmodel
*/
private fun initViewModel() {
// 观察来自 ViewModel 的键事件
model.keyEvent.observe(viewLifecycleOwner) {
handleKeyEvent(it)
}
}
class MainViewmodel : ViewModel() {
// 事件分发
private val _keyEvent = MutableLiveData<KeyEvent>()
val keyEvent: MutableLiveData<KeyEvent> get() = _keyEvent
/**
* 更新键事件的方法
*/
fun postKeyEvent(event: KeyEvent) {
......
_keyEvent.postValue(event)
}
}
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val model by viewModels<MainViewmodel>()
/**
* 事件分发逻辑
*/
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
// 自定义的事件分发逻辑
....
//传递事件到当前的fragment
model.postKeyEvent(event)
return super.dispatchKeyEvent(event)
}
}
// 如果需要使用 Kotlin 扩展函数
implementation("androidx.fragment:fragment-ktx:1.6.1")
implementation("androidx.activity:activity-ktx:1.8.2")
implementation("androidx.appcompat:appcompat:1.7.0")
// kotlin
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.22")
implementation("androidx.core:core-ktx:1.13.0")
// lifecycle viewmodel
val lifecycleVersion = "2.7.0"
// kotlin协程依赖
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-compiler:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-service:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-process:$lifecycleVersion")
1.Fragment 的 宿主比如 MainActivity,可以在Fragment 通过 getActivity()进行强转后F获取MainActivity对象,这样的话可以Fragment任何地方调用MainActivity中定义的方法,这是最推荐的方法
2.Fragment内定义监听器listenner,在宿主比如MainActivity 内对Fragement 设置监听,等fragment触发listenner后宿主MainActivity回调中调用MainActivity定义的方法
我现也是用第一种方法,((MainActivity) getActivity()).openWordFile(filePath);
但听人说不好,因为它破坏了Fragment的独立性,使得Fragment与特定的Activity紧密耦合。
但第二种又太繁琐,不方便。
正常来说,都是使用接口回调
// 定义接口
public interface MyCallback {
void openWordFile();
}
// Activity实现接口
public class MyActivity extends AppCompatActivity implements MyCallback {
@Override
public void someMethod() {
// 实现方法
}
}
((MyCallback) getActivity()).openWordFile();
这里最好可以判断一下, getActivity有可能没有实现MyCallback的回调