Объект, полученный из фрагмента, является нулевым в методе onCreateDialog внутри DialogFragment - PullRequest
0 голосов
/ 21 февраля 2020

Я получаю значение NULL в MyExistingComplain, когда я вхожу в него. Но это происходит только внутри метода onCreateDialog. Я хочу обновить макет этого диалога значениями объекта внутри MyExistingComplain.

Вот мой DialogFragment:

package com.example.atry.MakeComplaint

import Retrofit.INodeJS
import Retrofit.Observables
import Retrofit.RetrofitClient
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.location.Address
import android.location.Geocoder
import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.DialogFragment

import com.example.atry.R
import com.squareup.picasso.Picasso
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.activity_signup.*
import retrofit2.Call
import retrofit2.Response
import java.io.File
import java.util.*


class PopupDialog : DialogFragment() {

    lateinit var complaintIdView : TextView
    lateinit var complaintTypeView : TextView
    lateinit var complaintStatusView : TextView
    lateinit var complaintDateView : TextView
    lateinit var complaintLoctaionView : TextView
    lateinit var complaintImageView : ImageView
    lateinit var complaintDescriptionView : TextView
    lateinit var imagePath: String
    lateinit var address:String



    lateinit var myAPI: INodeJS
    val MyPREFERENCES = "MyPref"

    //// to display exisiting complaint in dialog popup
    var MyExistingComplain: Observables.Complaint?=null

    fun sendExistingComplaintItem(complaint:Observables.Complaint){

        this.MyExistingComplain = complaint
        Log.d("MyExistingComplain outside onCreateDialog", MyExistingComplain.toString())

    }


    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

        Log.d("MyExistingComplain inside onCreateDialog", MyExistingComplain.toString())

        val builder = AlertDialog.Builder(activity)

        val view = activity!!.layoutInflater.inflate(R.layout.existing_complaint_popup_inner, null, false)

         complaintIdView = view.findViewById<TextView>(R.id.complainNumber)
         complaintTypeView = view.findViewById<TextView>(R.id.complaintype)
         complaintStatusView = view.findViewById<TextView>(R.id.complainStatus)
         complaintDateView = view.findViewById<TextView>(R.id.complaindate)
         complaintLoctaionView = view.findViewById<TextView>(R.id.complainLocation)
         complaintImageView = view.findViewById<ImageView>(R.id.complainImage)
         complaintDescriptionView = view.findViewById<TextView>(R.id.complainDescription)





        complaintIdView.text = MyExistingComplain!!.id.toString()
        complaintTypeView.text = MyExistingComplain!!.ComplaintType.typeName
        complaintStatusView.text = MyExistingComplain!!.Status.statusType
//        complaintDateView.text = MyExistingComplain.
        complaintLoctaionView.text = address
        complaintDescriptionView.text = MyExistingComplain!!.description


        this.address =  getlocation(MyExistingComplain!!.Location.longitude, MyExistingComplain!!.Location.latitude)
        imagePath = MyExistingComplain!!.image


        val dl = File(imagePath)
        Log.d("file", dl.toString())
        if(!dl.exists()){
            Log.d("ddd1", "not exist")
        }
//        Picasso.get().load("http://192.168.0.107:3001" + dl).into(complaintImageView)
        //Picasso.get().load(File(imagePath)).into(myImage)




        builder.setView(view)


        val yes = view.findViewById(R.id.YES) as Button
        val no = view.findViewById(R.id.NO) as Button


        // set onclicklistener
        yes.setOnClickListener(View.OnClickListener {
            // I want the dialog to close at this point
            increment()
            dismiss()


        })

        // set onclicklistener
        no.setOnClickListener(View.OnClickListener {
            // I want the dialog to close at this point
            dismiss()
            descriptionFragment()

        })
        return builder.create()

    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return super.onCreateView(inflater, container, savedInstanceState)

        Log.d("2 IT IS HERE NOW!!", MyExistingComplain.toString())

    }

    private fun backFragment() {
        val manager = (context as AppCompatActivity).supportFragmentManager
        manager.popBackStackImmediate()

    }

    private fun descriptionFragment() {
        val dFragment= Category_Description()
        val lFragment = LocationFragment()
        val manager = (context as AppCompatActivity).supportFragmentManager
        val transaction =  manager.beginTransaction()
        transaction.replace(
            R.id.location_screen,
            dFragment
        ) // give your fragment container id in first parameter
        transaction.show(dFragment)
        transaction.hide(lFragment)
        transaction.isAddToBackStackAllowed
        transaction.addToBackStack(lFragment.fragmentManager.toString())  // if written, this transaction will be added to backstack
        transaction.commit()
    }

    private fun getlocation(longitude: String, latitude: String): String {
        val long = longitude.toDouble()
        val lat = latitude.toDouble()

        val geocoder: Geocoder
        val addresses: List<Address>
        geocoder = Geocoder(activity, Locale.getDefault())

        addresses = geocoder.getFromLocation(
            long,
            lat,
            1
        ) // Here 1 represent max location result to returned, by documents it recommended 1 to 5

        val address =
            addresses[0].getAddressLine(0) // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
//        val city = addresses[0].getLocality()
//        val state = addresses[0].getAdminArea()
//        val country = addresses[0].getCountryName()
//        val postalCode = addresses[0].getPostalCode()
//        val knownName = addresses[0].getFeatureName()
        Log.d("address", address)
//        Log.d("address", city)
//        Log.d("address", knownName)
        return address

    }


    private fun increment(){

        //INIT API

        val retrofit = RetrofitClient.instance
        myAPI = retrofit.create(INodeJS::class.java)

        val ComplainId= MyExistingComplain!!.id

        val preferences = this.activity!!.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE)

        val e =preferences!!.getString("accessToken", "nonono")

        val call = myAPI.increasePriority(ComplainId, e)

        call.enqueue(object : retrofit2.Callback<String> {
            override fun onFailure(call: Call<String>?, t: Throwable?) {

                Log.d("NO increment", t!!.message)

            }

            override fun onResponse(call: Call<String>?, response: Response<String>?) {
                //     Toast.makeText(this@ComplainFragment, "sucess", Toast.LENGTH_SHORT).show()
                if(response!!.code() == 200) {

                    Log.d("Increment done", "200")
                    Log.d("response", response.body().toString())

                    backFragment()

                }

                else if(response!!.code() == 201){
                    Log.d("Increment done already", "201")
                    Log.d("response", response.body().toString())

                    alreadyDonePopup()

                }



            }
        })

//        compositeDisposable.add(myAPI.increasePriority(ComplainId)
//            .subscribeOn(Schedulers.io())
//            .observeOn(AndroidSchedulers.mainThread())
//            .subscribe({ message ->
//                if (message.contains("registered")) {
//
//                    launchHomeActivity()
//                } else
//                    Toast.makeText(
//                        this@SignupActivity,
//                        "Error NOT REGISTERED",
//                        Toast.LENGTH_SHORT
//                    ).show()
//
//            },{  Throwable ->
//                if(!Throwable.toString().contains("500")){
//                    Toast.makeText(
//                        this@SignupActivity,
//                        "Error NOT registered 1",
//                        Toast.LENGTH_SHORT
//                    ).show()
//                }
//
//            }))

    }



    //opening up the AlreadyMadeComplaintPopup

    private fun alreadyDonePopup(){
        val fm = activity!!.supportFragmentManager
        val dialog = AlreadyMadeComplaintPopup() // creating new object
        dialog.show(fm, "dialog")
    }






}


Я попытался зарегистрировать свой объект внутри и снаружи метода onCreateDialog, и вот результаты. Кто-нибудь может мне помочь? Я искал inte rnet в течение нескольких часов и до сих пор не знаю, почему я получаю нулевой объект внутри метода onCreateDialog.

Это то, что я получаю в журнале:

D/MyExistingComplain outside onCreateDialog: Complaint(id=1, description=sewerage problem!!!!, image=null, Location=Location(longitude=somevalue, latitude=somevalue), ComplaintType=ComplaintType(typeName=Sewerage, image=null), Status=Status(id=0, statusType=Unresolved))
D/MyExistingComplain inside onCreateDialog: null
...