Chock Norris Facts Android App sur Kotlin

Chock Norris Facts Android App sur Kotlin


Faits sur Chuck Norris est un phénomène Internet avec des «faits» humoristiques sur le maître et acteur des arts martiaux Chuck Norris. Les "faits" sont des blagues sur l'endurance de Norris, sa masculinité et son statut masculin alpha.


Dans ce tutoriel, nous allons créer notre propre application Android avec des faits sur Chuck Norris en utilisant Kotlin. En tant qu'IDE, nous utiliserons Android Studio. Dans cet exemple, vous pouvez apprendre à effectuer des requêtes réseau sur Kotlin et à utiliser la bibliothèque OkHttp 3.


Les faits seront obtenus à partir d' une base de données de faits sur Chuck Norris, qui offre une API simple pour obtenir des faits aléatoires.


Ajouter une dépendance pour OkHttp


Pour effectuer des appels réseau, nous utiliserons la bibliothèque OkHttp. Nous devons donc ajouter la dépendance OkHttp 3.10 à notre fichier 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' } 

Personnaliser le manifeste Android


De plus, pour effectuer des appels réseau, nous devons ajouter l'autorisation INTERNET au manifeste de notre application:


 <?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> 

Création d'interface utilisateur


L'étape suivante consiste à créer l'interface utilisateur de notre application. Nous utiliserons ConstraintLayout comme composant racine de la mise en page.


En haut de notre interface utilisateur se trouve ImageView avec le visage de Chuck Norris:


Chuck Norris


Ensuite, nous ajoutons une TextView dans laquelle nous afficherons le fait de Chuck Norris. Pour TextView définissons la dépendance, qui est située juste en dessous d' ImageView . Après cela, ajoutez un bouton qui permettra aux utilisateurs de télécharger un nouveau fait, en le demandant à la base de données. Enfin, ajoutez la ProgressBar , qui sera centrée sur l'écran.


En conséquence, nous obtenons la disposition suivante pour notre interface utilisateur:


 <?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> 

Test d'API


Avant d'écrire le code dans MainActivity nous testons la réponse retournée par l'API de base de données. Nous contacterons l'adresse suivante: https://api.icndb.com/jokes/random .


Ce service Web renvoie au hasard un nouveau fait concernant Chuck Norris à chaque appel. En entrant l'URL dans un navigateur Web, vous obtiendrez le résultat suivant:


Résultat d'appel API


Ainsi, nous devrons analyser la réponse JSON pour accéder à la propriété joke , qui contient le fait dont nous avons besoin.


Écrire du code Kotlin pour MainActivity


Il est maintenant temps d'écrire du code pour MainActivity . Nous définissons une variable dans laquelle nous stockons l'URL du point de terminaison API que nous allons appeler. Ensuite, nous instancions l'objet OkHttpClient .


Dans la méthode onCreate MainActivity , nous devons simplement définir OnClickListener sur un bouton qui permet aux utilisateurs de télécharger de nouveaux faits sur Chuck Norris.


L'API est loadRandomFact dans la méthode spéciale loadRandomFact . Nous affichons la ProgressBar juste avant d'accéder au réseau. Ensuite, nous créons un objet Request avec l'URL du point de terminaison dans le paramètre.


Après cela, nous appelons la méthode newCall sur OkHttpClient , en lui passant Request comme paramètre. Pour traiter la réponse, nous appelons la méthode de mise en enqueue avec l'instance de enqueue dans le paramètre.


Dans la méthode onResponse nous obtenons une réponse, puis créons un JSONObject . La dernière étape consiste à obtenir la propriété joke de l'objet value . Après cela, nous pouvons afficher le fait de Chuck Norrim dans TextView en encapsulant tout dans le bloc runOnUiThread pour garantir que l'interface utilisateur est mise à jour dans le thread d'interface utilisateur.


En conséquence, nous obtenons le code suivant pour la MainActivity notre application 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) } } }) } } 

Lancez l'application


La meilleure partie de la leçon. Lorsque vous démarrez l'application, vous obtiendrez le résultat suivant:


Application prête

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


All Articles