Search code examples
androidgoogle-mapskotlinweather-api

How can I call a variab that I wrote in a non-Class place to another class?


1.The "address" variable here gives me a city name with coordinates.I would like to write this address instead of Istanbul in the retrofit so that it can automatically show the weather of the selected location on the map.(Googlemap)

private const val TAG = "MapViewFragment"
class MapViewFragment: Fragment(), OnMapReadyCallback {
    companion object{
        private lateinit var nMap: GoogleMap

        var address:String = ""
        var test:String = ""
        var test2:String = ""

        var cacik:String = "adana"

        private var markers:MutableList<Marker> = mutableListOf<Marker>()
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        map_view.onCreate(savedInstanceState)
        map_view.onResume()
        map_view.getMapAsync(this)
        setToolbar()
    }

    override fun onMapReady(map: GoogleMap?) {

        if (map != null) {
            nMap = map
        }

        map?.let {
            nMap = it

            nMap.setOnInfoWindowClickListener { markerToDelete ->
                Log.i(TAG, "onWindowsClickListener - Delete Thismarker")
                markers.remove(markerToDelete)
                markerToDelete.remove()
            }


            nMap.setOnMapLongClickListener { latlng ->

                Log.i(TAG, "onMapLongClickListener" + latlng)

                Toast.makeText(
                    requireContext(),
                    "this is toast message" + latlng,
                    Toast.LENGTH_SHORT
                ).show()
                showAlertDialog(latlng)



                address= getAddress(latlng.latitude, latlng.longitude)
                test = getAddress(37.000000,35.321335)
                test2 = "istanbul"


                Log.d(TAG,"test5 $address ${latlng.latitude} ${latlng.longitude}")
                Toast.makeText(requireContext(),"test"+address,Toast.LENGTH_LONG).show()
            }
        }
    }


    private fun getAddress(lat: Double, lng: Double): String {
        val geocoder = Geocoder(requireContext())
        val list = geocoder.getFromLocation(lat, lng, 1)
        return list[0].getAddressLine(0)
        //val stateName: String = addresses[0].getAddressLine(1)
    }

    private fun showAlertDialog(latlng: LatLng) {
        val dialog =
            AlertDialog.Builder(requireContext())
                .setTitle("Create a marker").setMessage("add marker...")
                .setNegativeButton("Cancel", null)
                .setPositiveButton("Ok", null)
                .show()

        dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener {
            val marker = nMap.addMarker(
                MarkerOptions().position(latlng).title("my new marker").snippet(
                    "a cool snippet"
                )
            )
            markers.add(marker)

            dialog.dismiss()
        }

        dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setOnClickListener {
            dialog.dismiss()
        }

    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.mapviewfragment, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }

    private fun setToolbar(){
        val actionBar : ActionBar? =(requireActivity() as MainActivity).supportActionBar
        actionBar?.apply {
            title = getString(R.string.Kartenansicht)
            setDisplayShowTitleEnabled(true)
            setHomeButtonEnabled(true)
        }
    }
}

3.i just want to call "address" in my retrofit response .I want to call the address on the other class and write the location of Istanbul.The getter and setter methods don't work because I haven't written them inside the class.How can I use the address in another class.

private const val TAG = "Retrofit Connection"


fun main(){
    retrofitResponse()

}

object RetrofitSetup {

    //var test = MapViewFragment.address
    var urlAll = "api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}"
    var url = "https://api.openweathermap.org/data/2.5/"
    val apiKey = "d459f98ffa705ad3f6c5e02f86d9fab9"

}

fun retrofitResponse(){

    val retrofit = Retrofit.Builder()
        .baseUrl(RetrofitSetup.url)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
    val weatherApi = retrofit.create(CallWeatherApi::class.java)
    val weatherResponseCall = weatherApi.getWeather(MapViewFragment.test,RetrofitSetup.apiKey)


    weatherResponseCall!!.enqueue(object : Callback<CurrentWeatherResponse?> {
        override fun onResponse(call: Call<CurrentWeatherResponse?>, response: Response<CurrentWeatherResponse?>
        ) {
            if (response.code() == 404) {
                Log.d(TAG,"Successfuly")
            } else if (!response.isSuccessful) {
                Log.d(TAG,"Error")
            }

            val mydata = response.body()
            val main = mydata!!.main
            val temp = main!!.temp
            val pres =main!!.pressure
            val temperature = (temp!! - 273.15).toInt()
            Log.d("TAG","City pressure :" + pres)
            Log.d("TAG","City Temp : " + temperature)


        }
        override fun onFailure(call: Call<CurrentWeatherResponse?>, t: Throwable) {}
    })
}


if i write default istanbul.its working

if i create another varible in other class dosent work

exception


Solution

  • put "retrofitResponse" inside "RetrofitSetup" and add a parameter for the addresss

    object RetrofitSetup {
        private const val urlAll = "api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}"
        private const val url = "https://api.openweathermap.org/data/2.5/"
        private const val apiKey = "keep this private"
        fun retrofitResponse(address: String) {
            ...
            val weatherResponseCall = weatherApi.getWeather(address, apiKey)
            ...
        }
    }
    

    then pass the address as argument

    nMap.setOnMapLongClickListener { latlng ->
        val address = getAddress(latlng.latitude, latlng.longitude)
        RetrofitSetup.retrofitResponse(address)
    }