我想做什么
我想从片段中调用活动,在Android应用程序中实现片段之间的转换和同时进行的活动。
我已经成功地从片段文件中调用了一个特定的活动文件方法,但是我在从片段调用整个活动时遇到了困难。
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上面的问题与我以前的问题相同:我如何在Android中修复从片段调用活动的代码?
错误与问题
它成功地构建了一个项目并在模拟器上运行了该应用程序。但是,当我单击按钮在Sample1Fragment上调用Sample1Fragment时,屏幕突然关闭。
我很难解决这个问题。
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 3.6.1
我想做的事
它尝试使用SingleLiveEvent推荐的答案,但我还没有找到在当前代码ListViewModel.kt和Sample1Fragment.kt上实现它的适当方法。
参考资料:LiveData与SnackBar、导航和其他事件( SingleLiveEvent案例)
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
}
}这些是我要面对的错误信息


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))
}
})
}
})
}
}这是我要面对的错误信息

发布于 2020-03-10 21:15:10
在Sample1Fragment.kt中,您要在 onActivityCreated()方法中重写onViewCreated() 。
这就是为什么你
修饰符“覆盖”不适用于“本地函数”
关于导航:有几种可能的方法可以在不同的活动和片段之间导航:
https://stackoverflow.com/questions/60625386
复制相似问题