Chock Norris Facts Android App no ​​Kotlin

Chock Norris Facts Android App no ​​Kotlin


Fatos sobre Chuck Norris é um fenômeno da Internet com “fatos” humorísticos sobre o mestre e ator de artes marciais Chuck Norris. "Fatos" são piadas sobre a resistência de Norris, sua masculinidade e status de macho alfa.


Neste tutorial, criaremos nosso próprio aplicativo Android com fatos sobre Chuck Norris usando o Kotlin. Como IDE, usaremos o Android Studio. Neste exemplo, você pode aprender como executar solicitações de rede no Kotlin e como usar a biblioteca OkHttp 3.


Os fatos serão obtidos de um banco de dados de fatos sobre Chuck Norris, que oferece uma API simples para obter fatos aleatórios.


Adicionar dependência para OkHttp


Para fazer chamadas de rede, usaremos a biblioteca OkHttp. Portanto, precisamos adicionar a dependência do OkHttp 3.10 ao nosso arquivo build.gradle :


 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 27 defaultConfig { applicationId "com.ssaurel.chucknorrisfacts" minSdkVersion 15 targetSdkVersion 27 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.2' implementation 'com.squareup.okhttp3:okhttp:3.10.0' } 

Personalizar manifesto do Android


Além disso, para fazer chamadas de rede, precisamos adicionar a permissão INTERNET ao manifesto de nosso aplicativo:


 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ssaurel.chucknorrisfacts"> <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> 

Criação da interface do usuário


O próximo passo é criar a interface do usuário do nosso aplicativo. Usaremos ConstraintLayout como o componente raiz do layout.


No topo da nossa interface do usuário, haverá um ImageView com a face de Chuck Norris:


Chuck Norris


Em seguida, adicionamos um TextView no qual exibiremos o fato de Chuck Norris. Para o TextView definimos a dependência, localizada logo abaixo do ImageView . Depois disso, adicione um botão que permita que os usuários baixem um novo fato, solicitando-o ao banco de dados. Por fim, adicione o ProgressBar , que será centralizado na tela.


Como resultado, obtemos o seguinte layout para nossa interface do usuário:


 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.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" android:background="#FFFFFF" tools:context=".MainActivity"> <ImageView android:id="@+id/imageView" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="30dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/chucknorris" /> <TextView android:id="@+id/factTv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="30dp" android:text="Chuck Norris Fact" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView" android:textSize="20sp" android:paddingLeft="30dp" android:paddingRight="30dp" android:gravity="center_horizontal"/> <Button android:id="@+id/nextBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="30dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:text="Next" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:visibility="gone"/> </android.support.constraint.ConstraintLayout> 

Teste de API


Antes de escrever o código em MainActivity testamos a resposta retornada pela API do banco de dados. Entraremos em contato com o seguinte endereço: https://api.icndb.com/jokes/random .


Esse serviço da Web retorna aleatoriamente um fato novo sobre Chuck Norris em todas as chamadas. Ao inserir o URL em um navegador da Web, você obterá o seguinte resultado:


Resultado da chamada da API


Portanto, precisaremos analisar a resposta JSON para obter a propriedade piada , que contém o fato de que precisamos.


Escrevendo código Kotlin para MainActivity


Agora é hora de escrever o código para MainActivity . Definimos uma variável na qual armazenamos o URL do terminal da API que vamos chamar. Em seguida, instanciamos o objeto OkHttpClient .


No método onCreate MainActivity , basta definir OnClickListener como um botão que permita aos usuários baixar novos fatos sobre Chuck Norris.


A API é loadRandomFact no método loadRandomFact especial. Exibimos a ProgressBar imediatamente antes de acessar a rede. Em seguida, criamos um objeto Request com a URL do terminal no parâmetro


Depois disso, chamamos o método OkHttpClient no OkHttpClient , passando Request como um parâmetro para ele. Para processar a resposta, chamamos o método de enqueue com a instância de Callback chamada no parâmetro


No método onResponse obtemos uma resposta e, em seguida, criamos um JSONObject . A etapa final é obter a propriedade de piada do objeto de valor . Depois disso, podemos exibir o fato de Chuck Norrim no TextView encapsulando tudo no bloco runOnUiThread para garantir que a interface do usuário seja atualizada no encadeamento da interface do usuário.


Como resultado, obtemos o seguinte código para a MainActivity nosso aplicativo Android:


 package com.ssaurel.chucknorrisfacts import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.text.Html import android.view.View import kotlinx.android.synthetic.main.activity_main.* import okhttp3.* import org.json.JSONObject import java.io.IOException class MainActivity : AppCompatActivity() { val URL = "https://api.icndb.com/jokes/random" var okHttpClient: OkHttpClient = OkHttpClient() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) nextBtn.setOnClickListener { loadRandomFact() } } private fun loadRandomFact() { runOnUiThread { progressBar.visibility = View.VISIBLE } val request: Request = Request.Builder().url(URL).build() okHttpClient.newCall(request).enqueue(object: Callback { override fun onFailure(call: Call?, e: IOException?) { } override fun onResponse(call: Call?, response: Response?) { val json = response?.body()?.string() val txt = (JSONObject(json).getJSONObject("value").get("joke")).toString() runOnUiThread { progressBar.visibility = View.GONE factTv.text = Html.fromHtml(txt) } } }) } } 

Inicie o aplicativo


A melhor parte da lição. Ao iniciar o aplicativo, você obterá o seguinte resultado:


Aplicação pronta

Source: https://habr.com/ru/post/pt450488/


All Articles