gpt4 book ai didi

java - 考虑到其创建顺序,如何管理片段和 Activity ?

转载 作者:行者123 更新时间:2023-12-02 08:53:36 25 4
gpt4 key购买 nike

我想做什么

我想在Android应用程序中从Fragment调用Activity来同时实现Fragment和Activity之间的转换。

我已成功从片段文件调用 Activity 文件的一个特定方法,但在从片段调用整个 Activity 时遇到问题。

SampleFragment - MainActivity's fragmentMethod() is called once  the button is clicked on the page
Sample1Fragment - FormActivity is called once the button is clicked on the page
FormActivity - FormActivity2 is called once the button is clicked on the page

以上与我之前的问题相同:How can I fix the code to call Activity from Fragment in Android App?

错误和问题

已成功构建项目并在模拟器上运行应用程序。然而,当我点击Sample1Fragment上的FormActivity按钮时,屏幕突然关闭了。

我无法解决此问题。

Sample1Fragment.kt 上以下部分的错误消息

Modifier 'override' is not applicable to 'local function'

Sample1Fragment.kt

    override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)

override fun onViewCreated(view: View, savedInstanceState: Bundle) {
btnClick2.setOnClickListener(object:View.OnClickListener{

// here I would like to move to FormActivity
override fun onClick(v: View?) {
activity?.startActivity(Intent(context, FormActivity::class.java))
}

})
}

当前代码

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// make the list of fragment
val fragmentList = arrayListOf<Fragment>(
SampleFragment(),
Sample1Fragment()
)

// create instance of adapter
val adapter = SamplePagerAdapter(supportFragmentManager, fragmentList)
/// set adapter
viewPager.adapter = adapter
}



public fun fragmentMethod() {
Toast.makeText(this@MainActivity, "Method called From Fragment", Toast.LENGTH_LONG).show();
}
}

SampleFragment.kt

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.fragment_sample.*

class SampleFragment : Fragment() {


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {

}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_sample, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
btnClick.setOnClickListener(object:View.OnClickListener{
override fun onClick(v: View?) {
(activity as MainActivity).fragmentMethod()
}

})
}



}

Sample1Fragment.kt

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.fragment_sample1.*
import android.content.Intent

class Sample1Fragment : Fragment() {

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_sample1, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)

override fun onViewCreated(view: View, savedInstanceState: Bundle) {
btnClick2.setOnClickListener(object:View.OnClickListener{

// here I would like to move to FormActivity
override fun onClick(v: View?) {
activity?.startActivity(Intent(context, FormActivity::class.java))
}

})
}

}

}

开发环境

Android Studio 3.6.1

我尝试做什么

它尝试使用答案中推荐的 SingleLiveEvent,但我还没有找到在我当前的代码 ListViewModel.kt 上实现它的适当方法>Sample1Fragment.kt.

引用:LiveData with SnackBar, Navigation and other events (the SingleLiveEvent case)

ListViewModel.kt

import android.app.usage.UsageEvents
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class ListViewModel : ViewModel() {
private val _navigateToDetails = MutableLiveData<UsageEvents.Event<String>>()

val navigateToDetails : LiveData<UsageEvents.Event<String>>
get() = _navigateToDetails


@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
fun userClicksOnButton(itemId: String) {
_navigateToDetails.value =
UsageEvents.Event(itemId) // Trigger the event by setting a new Event as a new value
}
}

这些是我面临的错误消息

error4 error5

Sample1Fragment.kt

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.fragment_sample1.*
import android.content.Intent


class Sample1Fragment : Fragment() {

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_sample1, container, false)
}

myViewModel.navigateToDetails.observe(this, Observer {
it.getContentIfNotHandled()?.let { // Only proceed if the event has never been handled
fun onViewCreated(view: View, savedInstanceState: Bundle) {
btnClick2.setOnClickListener(object:View.OnClickListener{

// here I would like to move to FormActivity
override fun onClick(v: View?) {
activity?.startActivity(Intent(context, FormActivity::class.java))
}

})
}
})

}

}

这是我面临的错误消息

Sample1Fragment.kt error

最佳答案

Sample1Fragment.kt 中,您正在重写 onViewCreated() 内部 onActivityCreated() 方法。
这就是为什么你会得到

Modifier 'override' is not applicable to 'local function'


关于导航:有几种可能的方法可以在不同的 Activity 和片段之间导航:

  1. navigation ,这通常是最容易实现的
  2. callbacks ,当您在 Android Studio 中创建 Fragment 时已预设
  3. view model ,在片段及其 Activity 之间共享。在这种情况下,我建议使用 SingleLiveEvent触发事件。

关于java - 考虑到其创建顺序,如何管理片段和 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60625386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com