Что я хотел бы сделать
Я хотел бы вызвать Activity из фрагмента, чтобы реализовать одновременно переходы между фрагментами и действиями в приложении Android.
Мне удалось вызвать один конкретный метод c для файла действий из файла фрагмента, но у меня возникают проблемы с вызовом всей операции из фрагмента.
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
Выше приведен тот же вопрос, что и в предыдущем вопросе: Как я могу исправить код для вызова Activity из фрагмента в Android App?
Ошибки и проблемы
Удалось построить проект и запустить приложение на эмуляторе. Однако экран внезапно закрылся, когда я нажал кнопку, чтобы вызвать FormActivity в 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 Studio 3.6.1
Что я пытался сделать
Он пытался использовать SingleLiveEvent
рекомендуется для ответа, но я не нашел подходящего способа реализовать его в моем текущем коде, ListViewModel.kt
и Sample1Fragment.kt
.
Ссылка: LiveData с SnackBar, Navigation и другие события (случай 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
}
}
Это сообщения об ошибках, с которыми я сталкиваюсь
![error5](https://i.stack.imgur.com/e5188.png)
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](https://i.stack.imgur.com/Sarj4.png)