首页 新闻 会员 周边 捐助

Android开发,在Fragment中调用Activity中的方法用哪种方式比较好?

0
悬赏园豆:5 [已解决问题] 解决于 2024-10-10 08:35

Android开发,在Fragment中调用Activity中的方法用哪种方式比较好?

tea2007的主页 tea2007 | 初学一级 | 园豆:24
提问于:2024-09-27 16:00
< >
分享
最佳答案
0

如果使用的是kotlin的语法,则可以尝试viewmodel,viewmodel有一个特点就是fragment和activity可以共用一个viewmodel,把数据的处理逻辑都写在viewmodel里,fragment和activity进行livedata数据监听就行

收获园豆:3
七七七七七子 | 菜鸟二级 |园豆:446 | 2024-09-30 16:27
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")

七七七七七子 | 园豆:446 (菜鸟二级) | 2024-09-30 16:32
其他回答(2)
0

1.Fragment 的 宿主比如 MainActivity,可以在Fragment 通过 getActivity()进行强转后F获取MainActivity对象,这样的话可以Fragment任何地方调用MainActivity中定义的方法,这是最推荐的方法
2.Fragment内定义监听器listenner,在宿主比如MainActivity 内对Fragement 设置监听,等fragment触发listenner后宿主MainActivity回调中调用MainActivity定义的方法

收获园豆:1
bug的创造者 | 园豆:403 (菜鸟二级) | 2024-09-27 16:17

我现也是用第一种方法,((MainActivity) getActivity()).openWordFile(filePath);
但听人说不好,因为它破坏了Fragment的独立性,使得Fragment与特定的Activity紧密耦合。

但第二种又太繁琐,不方便。

支持(0) 反对(0) tea2007 | 园豆:24 (初学一级) | 2024-09-27 16:25
0

正常来说,都是使用接口回调

// 定义接口
public interface MyCallback {
    void openWordFile();
}

// Activity实现接口
public class MyActivity extends AppCompatActivity implements MyCallback {
    @Override
    public void someMethod() {
        // 实现方法
    }
}

((MyCallback) getActivity()).openWordFile();
这里最好可以判断一下, getActivity有可能没有实现MyCallback的回调

收获园豆:1
shunlibest | 园豆:239 (菜鸟二级) | 2024-09-27 17:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册