Как я могу управлять фрагментом и действием, учитывая его порядок создания? - PullRequest
0 голосов
/ 10 марта 2020

Что я хотел бы сделать

Я хотел бы вызвать 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
    }
}

Это сообщения об ошибках, с которыми я сталкиваюсь

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

1 Ответ

1 голос
/ 11 марта 2020

В Sample1Fragment.kt вы переопределяете onViewCreated() внутри onActivityCreated() метода. Вот почему вы получаете

Модификатор 'override' не применим к 'локальной функции'

О навигации: есть несколько возможных способов навигации между различными действиями и фрагментами:

  1. навигация , который обычно проще всего реализовать
  2. обратные вызовы , которые уже заданы при создании фрагмента в Android Studio
  3. просмотр модели , совместно используемой фрагментом и его активностью. В этом случае я предлагаю использовать SingleLiveEvent для запуска события.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...