Передача значений из одного фрагмента в другой - PullRequest
0 голосов
/ 16 февраля 2020

Я работаю в Kotlin и использую модернизацию. У меня есть вид переработчика, который состоит из карт. У каждой карты есть имя типа и связанное с ним изображение, которое я на данный момент добавил статически, используя класс данных. Теперь мне нужно передать typeName только из CategoryFragment в LocationFragment, как только пользователь нажмет на определенную карту. И в LocationFragment я хочу проверить широту, долготу и typeName из базы данных, если она уже существует.

Вот мой код для класса данных Category: класс данных Category_dataclass (val category_image: Int, val typeName: String)

Вот мой код для фрагмента Category:

package com.example.atry.MakeComplaint

import android.content.Context
import android.net.Uri
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.atry.History.Complaints
import com.example.atry.History.MyComplainRecyclerViewAdapter

import com.example.atry.R
import kotlinx.android.synthetic.main.existing_complaint_popup.*


class CategoryFragment : 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
        val v = inflater.inflate(R.layout.fragment_category, container, false)
        val recyclerView = v.findViewById(R.id.category_list) as RecyclerView

        recyclerView.apply {
            layoutManager = GridLayoutManager(context!!, 2)
        }

        //creating an arraylist to store category using the data class user
        val category = ArrayList<Category_dataclass>()

        //adding some dummy data to the list of categories
        category.add(Category_dataclass((R.drawable.trash) , "Water"))
        category.add(Category_dataclass((R.drawable.fire) , "Sewerage"))
        category.add(Category_dataclass((R.drawable.dustbin) , "load"))




        //creating our adapter
        val adapter = CategoryRecyclerViewAdapter(category)

        //now adding the adapter to recyclerview
        recyclerView.adapter = adapter


        // Inflate the layout for this fragment
        return v



    }




    }

Вот адаптер CategoryRecyclerViewAdapter:

package com.example.atry.MakeComplaint

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.example.atry.History.ComplaintDetailsFragment
import com.example.atry.History.Complaints
import com.example.atry.MakeComplaint.Category_dataclass
import com.example.atry.MakeComplaint.CategoryRecyclerViewAdapter
import com.example.atry.R
import java.util.*
import kotlin.collections.ArrayList

class CategoryRecyclerViewAdapter(val categoryList: ArrayList<Category_dataclass>) : RecyclerView.Adapter<CategoryRecyclerViewAdapter.ViewHolder>() {




    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CategoryRecyclerViewAdapter.ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.fragment_category_single, parent, false)
        return ViewHolder(v)
    }

    //this method is binding the data on the list
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bindItems(categoryList[position])
        holder.mView.setOnClickListener{view->



            val lFragment = LocationFragment()
            val oldFragment = CategoryFragment()
            val manager = (holder.mView.context as AppCompatActivity).supportFragmentManager
            val transaction =  manager.beginTransaction()
            transaction.replace(
                R.id.first_screen_of_makecomplaint,
                lFragment
            ) // give your fragment container id in first parameter
            transaction.show(lFragment)
            transaction.hide(oldFragment)
            transaction.isAddToBackStackAllowed
            transaction.addToBackStack(oldFragment.fragmentManager.toString())  // if written, this transaction will be added to backstack
            transaction.commit()

        }
    }


    //this method is giving the size of the list
    override fun getItemCount(): Int {
        return categoryList.size
    }


    inner class ViewHolder(val mView : View) : RecyclerView.ViewHolder(mView) {
        fun bindItems(cat:Category_dataclass) {
            val imageViewName = mView.findViewById(R.id.category_image) as ImageView
            val textViewtext = mView.findViewById(R.id.category_text) as TextView

            imageViewName.setImageResource(cat.category_image)
            textViewtext.text = cat.typeName


        }



    }

}

И это моя модификация:

 //to check existing complaint

    @GET("api/existingComplain")
    @FormUrlEncoded
    fun checkExistingComplain(@Query("typeName") typeName:String,
                              @Query("longitude") longitude:String,
                              @Query("latitude") latitude:String):Observable<Observables.checkExistingResult>

Я создал объект, в котором хранил класс данных, который будет возвращать следующее:

data class checkExistingResult(val description:String , val Complain:String)

если typeName и location уже существуют в базе данных, я хочу, чтобы описание и Пожаловаться отображались в диалоговом окне с материалами.

1 Ответ

0 голосов
/ 17 февраля 2020

Вы можете попробовать это:

1-й шаг: -

val dashboard = "Dashboard"

взять переменную, подобную этой, вы можете принять ее имя в качестве имени фрагмента, так что название страницы вы можно проверить вот так MainActivity().dashboard

Теперь 2-й шаг: -

создать один класс и написать функцию в этом классе

 fun openPage(
    activity: Activity,
    pagename: String?, model: PaymentDetails
) {
    when (pagename) {

            MainActivity().dashboard -> {
                val mfragment = DashboardFragment()
                (activity as MainActivity).fragmentManager.beginTransaction()
                    .replace(R.id.nav_host, mfragment).commit()

                val a = Bundle()
                a.putSerializable("model", model)
                mfragment.arguments = a
            }
        }
    }

возьмите пару ключ-значение, как я беру всю свою модель, и ключ - модель , в моем коде вы можете написать любую вещь.

3-й шаг: -

Сделайте вашу модель Сериализуемой

4-й шаг: - Когда вы добавляете свои значения в модель, добавьте детали и добавьте вашу модель для метода, в котором вы хотите использовать эти значения как следующие

val payment = PaymentDetails(
            type,
            price,
            name,
            id,
         )
        paymentData!!.add(payment)
        CustomMethods().openPagePaymentDetails(
            activity!!,
            MainActivity().sessionPaymentFragment, payment
        )

5-й шаг: -

Объявите и инициализируйте ваш объект с типом вашей модели, как показано ниже:

 //Declare 
 private var model: PaymentDetails? = null 

//initialise
 model = arguments!!.getSerializable("model") as PaymentDetails?

И теперь, наконец, вы можете получить доступ к значению предыдущего фрагмента в следующем фрагменте следующим образом:

var type: String
type = model!!.type

Примечание: - пожалуйста, не забудьте сделать класс вашей модели Сериализуемый

Надеюсь, это поможет вам.

...