Apa yang ingin saya lakukan?

Saya ingin memanggil Aktivitas dari Fragmen untuk mewujudkan transisi di antara fragmen dan aktivitas secara bersamaan di aplikasi Android.

Saya telah berhasil memanggil satu metode spesifik pada file aktivitas dari file fragmen, tetapi saya mengalami masalah dengan memanggil seluruh aktivitas dari sebuah fragmen.

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

Di atas sama dengan pertanyaan saya sebelumnya: Bagaimana cara memperbaiki kode untuk memanggil Aktivitas dari Fragmen di Aplikasi Android?

Kesalahan dan Masalah

Berhasil membangun proyek dan menjalankan aplikasi di emulator. Namun, layar tiba-tiba mati ketika saya mengklik tombol untuk memanggil FormActivity di Sample1Fragment.

Saya memiliki masalah dengan memperbaiki masalah ini.

Pesan Kesalahan ke bagian di bawah ini di 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))
                }

            })
        }

Kode saat ini

Aktivitas Utama.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))
                }

            })
        }

    }

}

Mengembangkan Lingkungan

Android Studio 3.6.1

Apa yang saya coba lakukan

Itu mencoba menggunakan SingleLiveEvent yang direkomendasikan pada jawaban, tetapi saya belum menemukan cara yang tepat untuk mengimplementasikannya pada kode saya saat ini, ListViewModel.kt dan Sample1Fragment.kt.

Referensi: LiveData dengan SnackBar, Navigasi dan acara lainnya (kasus 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
    }
}

Ini adalah pesan kesalahan yang saya hadapi

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))
                }

            })
        }
    })

    }

}

Ini adalah pesan kesalahan yang saya hadapi

Sample1Fragment.kt error

0
halt 10 Maret 2020, 23:23

1 menjawab

Jawaban Terbaik

Dalam Sample1Fragment.kt Anda mengganti metode onViewCreated() di dalam onActivityCreated().
Inilah mengapa Anda mendapatkan

Pengubah 'override' tidak berlaku untuk 'fungsi lokal'


Tentang navigasi: ada beberapa kemungkinan cara untuk menavigasi antara aktivitas dan fragmen yang berbeda:

  1. yang paling mudah untuk diimplementasikan"
  2. callback, yang sudah disetel sebelumnya saat Anda membuat fragmen di Android Studio
  3. model tampilan, dibagikan antara fragmen dan aktivitasnya. Dalam hal ini, saya sarankan menggunakan SingleLiveEvent untuk memicu acara.
1
Primož Ivančič 10 Maret 2020, 21:15