Aplicaci贸n para Android Chock Norris Facts en Kotlin

Aplicaci贸n para Android Chock Norris Facts en Kotlin


Datos sobre Chuck Norris es un fen贸meno de Internet con "hechos" humor铆sticos sobre el maestro y actor de artes marciales Chuck Norris. Los "hechos" son bromas sobre la resistencia de Norris, su masculinidad y su condici贸n de macho alfa.


En este tutorial, crearemos nuestra propia aplicaci贸n de Android con datos sobre Chuck Norris usando Kotlin. Como IDE usaremos Android Studio. En este ejemplo, puede aprender c贸mo realizar solicitudes de red en Kotlin y c贸mo usar la biblioteca OkHttp 3.


Los datos se obtendr谩n de una base de datos de datos sobre Chuck Norris, que ofrece una API simple para obtener datos aleatorios.


Agregar dependencia para OkHttp


Para realizar llamadas de red, utilizaremos la biblioteca OkHttp. Entonces, necesitamos agregar la dependencia OkHttp 3.10 a nuestro archivo 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 manifiesto de Android


Adem谩s, para realizar llamadas de red, debemos agregar el permiso de INTERNET al manifiesto de nuestra aplicaci贸n:


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

Creaci贸n de interfaz de usuario


El siguiente paso es crear la interfaz de usuario de nuestra aplicaci贸n. Usaremos ConstraintLayout como el componente ra铆z del dise帽o.


En la parte superior de nuestra interfaz de usuario estar谩 ImageView con la cara de Chuck Norris:


Chuck Norris


Luego agregamos un TextView en el que TextView el hecho de Chuck Norris. Para TextView definimos la dependencia, que se encuentra justo debajo de ImageView . Despu茅s de eso, agregue un bot贸n que permita a los usuarios descargar un nuevo hecho, solicit谩ndolo desde la base de datos. Finalmente, agregue la ProgressBar , que se centrar谩 en la pantalla.


Como resultado, obtenemos el siguiente dise帽o para nuestra interfaz de usuario:


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

Prueba de API


Antes de escribir el c贸digo en MainActivity probamos la respuesta devuelta por la API de la base de datos. Nos pondremos en contacto con la siguiente direcci贸n: https://api.icndb.com/jokes/random .


Este servicio web devuelve aleatoriamente un nuevo hecho sobre Chuck Norris en cada llamada. Al ingresar la URL en un navegador web, obtendr谩 el siguiente resultado:


Resultado de la llamada API


Entonces, necesitaremos analizar la respuesta JSON para llegar a la propiedad de broma , que contiene el hecho que necesitamos.


Escribir c贸digo de Kotlin para MainActivity


Ahora es el momento de escribir c贸digo para MainActivity . Definimos una variable en la que almacenamos la URL de punto final de API a la que vamos a llamar. Luego instanciamos el objeto OkHttpClient .


En el m茅todo onCreate MainActivity , solo necesitamos configurar OnClickListener en un bot贸n que permita a los usuarios descargar nuevos datos sobre Chuck Norris.


Se loadRandomFact a la API en el m茅todo especial loadRandomFact . Mostramos la barra de ProgressBar justo antes de acceder a la red. Luego creamos un objeto Request con la URL del punto final en el par谩metro.


Despu茅s de eso, llamamos al m茅todo newCall en OkHttpClient , pas谩ndole Request como par谩metro. Para procesar la respuesta, llamamos al m茅todo en enqueue con la instancia de Callback en el par谩metro.


En el m茅todo onResponse obtenemos una respuesta y luego creamos un JSONObject . El 煤ltimo paso es obtener la propiedad de broma del objeto de valor . Despu茅s de eso, podemos mostrar el hecho de Chuck Norrim en TextView encapsulando todo en el bloque runOnUiThread para garantizar que la interfaz de usuario se actualice en el hilo de la interfaz de usuario.


Como resultado, obtenemos el siguiente c贸digo para MainActivity nuestra aplicaci贸n de 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) } } }) } } 

Inicia la aplicaci贸n


La mejor parte de la lecci贸n. Cuando inicie la aplicaci贸n, obtendr谩 el siguiente resultado:


Aplicaci贸n lista

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


All Articles