Procurar endereço com o CEP em Kotlin
Android Kotlin

Procurar endereço com o CEP em Kotlin





Nesse tutorial vou descrever como Procurar endereço com o CEP em Kotlin para que você possa aprender a utilizar JSON com pesquisas na internet.

Primeiramente vamos criar um projeto vazio(Empty) para fazer as mudanças e assim conseguir procurar o endereço a partir do CEP.

Se você ainda não sabe como criar um projeto vazio veja então o tutorial Como criar um projeto no Android Studio ou Video 1: Novo projeto e emulador.

Logo depois de criar o projeto vamos então editar o nosso arquivo do AndroidManifest para que possa fazer conexão com a internet deixando o código da seguinte forma.

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.uware.cep">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Vamos agora editar o nosso layout para assim ter os objetos que precisamos e vamos ficar com o código da seguinte forma.

activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <LinearLayout
        android:id="@+id/laySearch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="20dp"
        app:layout_constraintTop_toTopOf="parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Digite o CEP:"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        <EditText
            android:id="@+id/etCEP"
            android:inputType="number"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/btnSearch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Pesquisar"/>
    </LinearLayout>
    <ProgressBar
        android:id="@+id/pbCep"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:layout_constraintTop_toBottomOf="@+id/laySearch"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
    <TextView
        android:id="@+id/tvResp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:gravity="center"
        android:layout_margin="20dp"
        app:layout_constraintTop_toBottomOf="@+id/laySearch"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>




Vamos logo após ter modificado o nosso layout vamos fazer a parte da programação dentro da MainActivity e para isso vamos usar uma tarefa assíncrona para fazer a pesquisa na internet.

Mas antes de fazer a mudança em nossa MainActivity vamos criar um package com o nome de functions.

Se você ainda não sabe como criar o package visite o link.

E também vamos criar uma classe dentro desse package com o nome Anime para que apareça uma ProgressBar enquanto busca o resultado na internet.

Se você não sabe como criar uma classe visite o link.

Vamos deixar o código assim como o a seguir.

Anime

package br.com.uware.cep.functions

import android.os.Handler
import android.view.View
import android.view.animation.AlphaAnimation

class Anime {
    var now: Boolean = false
    private fun fadeIn(view: View){
        val animation = AlphaAnimation(0f,1f)
        animation.duration = 500L
        animation.repeatCount = 0
        view.startAnimation(animation)
    }
    private fun fadeOut(view: View){
        val animation = AlphaAnimation(1f,0f)
        animation.duration = 500L
        animation.repeatCount = 0
        view.startAnimation(animation)
    }
    fun tradeView(view1: View, view2: View){
        fadeOut(view1)
        Handler().postDelayed({
            view1.visibility = View.INVISIBLE
            view2.visibility = View.VISIBLE
            fadeIn(view2)
            now = false
        }, 500L)
    }

}

MainActivity

package br.com.uware.cep

import android.content.Context
import android.os.AsyncTask
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.Settings
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.Toast
import br.com.uware.cep.functions.Anime
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStream
import java.net.HttpURLConnection
import java.net.URL

class MainActivity : AppCompatActivity() {
    val anime = Anime()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        etCEP.addTextChangedListener(MaskEditUtil.mask(etCEP,"#####-###"))
        btnSearch.setOnClickListener {
            if(etCEP.text.toString().length != 9){
                Toast.makeText(this,"CEP precisa ter 8 Digitos", Toast.LENGTH_LONG).show()
            }
            else{
                getCep(etCEP.text.toString())
            }
            it.hideKeyboard()
        }
    }
    fun getCep(cep: String){
        val url= "https://viacep.com.br/ws/"+cep+"/json/"
        anime.tradeView(tvResp, pbCep)
        MyAsyncTask().execute(url)
    }
    object MaskEditUtil {
        fun mask(ediTxt: EditText, mask: String): TextWatcher {
            return object : TextWatcher {
                var isUpdating: Boolean = false
                var old = ""
                override fun afterTextChanged(s: Editable) {}
                override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
                override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
                    val str = unmask(s.toString())
                    var mascara = ""
                    if (isUpdating) {
                        old = str
                        isUpdating = false
                        return
                    }
                    var i = 0
                    for (m in mask.toCharArray()) {
                        if (m != '#' && str.length > old.length) {
                            mascara += m
                            continue
                        }
                        try {
                            mascara += str[i]
                        } catch (e: Exception) {
                            break
                        }
                        i++
                    }
                    isUpdating = true
                    ediTxt.setText(mascara)
                    ediTxt.setSelection(mascara.length)
                }
            }
        }
        fun unmask(s: String): String {
            return s.replace("[-]".toRegex(), "")
        }
    }
    inner class MyAsyncTask: AsyncTask<String, String, String>() {
        override fun onPreExecute() {
        }
        override fun doInBackground(vararg params: String?): String {
            try {
                val url = URL(params[0])
                val urlConnection = url.openConnection() as HttpURLConnection
                urlConnection.connectTimeout = 7000
                var instring = ConvertStreamString(urlConnection.inputStream)
                publishProgress(instring)
            } catch (ex: Exception) {
                Log.d("Erro: ", ex.toString())
            }
            return ""
        }
        override fun onProgressUpdate(vararg params: String?) {
            try {
                var json = JSONObject(params[0])
                val cep = json.getString("cep")
                val logradouro = json.getString("logradouro")
                val bairro = json.getString("bairro")
                val cidade = json.getString("localidade")
                val estado = json.getString("uf")
                anime.tradeView(pbCep,tvResp)
                tvResp.text =
                    "Dados\ncep: " + cep + "\nRua: " + logradouro + "\nBairro: " + bairro + "\nCidade: " + cidade + "\nEstado: " + estado
            } catch (ex: Exception) {
                Log.d("Erro: ", ex.toString())
            }
        }
        fun ConvertStreamString(inputStream: InputStream): String {
            val reader = BufferedReader(inputStream.reader())
            val content = StringBuilder()
            var line = reader.readLine()
            reader.use { reader ->
                while (line != null) {
                    content.append(line)
                    line = reader.readLine()
                }
            }
            return content.toString()
        }
    }

    // Hide Keyboard
    fun View.hideKeyboard() {
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(windowToken, 0)
    }
}

Então chegou a hora de compilar e executar o projeto para ver como funciona para pegar o endereço a partir do CEP.

Foi criado um gist do nosso projeto para facilitar, então se sovê quiser clonar nosso projeto você pode utilizar a seguinte linha para isso.

[[email protected] ~]$ git clone https://github.com/uware-com-br/CEP_Kotlin

Assim você vai precisar digitar o seguinte comando quando for atualizar seu repositório.

[[email protected] ~]$ git pull

E assim seu repositório será atualizado.

Enfim espero poder ter ajudado com mais este tutorial sobre Procurar endereço com o CEP em Kotlin.

Fonte:

Veja também nossos vídeos e siga o nosso canal no YouTube:





Rodrigo Leutz
Desenvolvedor Web e Android ( Kotlin e Java )
https://uware.com.br