Chock Norris Facts تطبيق أندرويد على Kotlin

Chock Norris Facts تطبيق أندرويد على Kotlin


حقائق عن تشاك نوريس هي ظاهرة على الإنترنت مع "حقائق" روح الدعابة عن سيد فنون القتال والممثل تشاك نوريس. "الحقائق" هي نكات عن قدرة نوريس على التحمل ، ورجوله وحالة ألفا.


في هذا البرنامج التعليمي ، سننشئ تطبيق Android الخاص بنا مع حقائق حول Chuck Norris باستخدام Kotlin. كما IDE سوف نستخدم Android Studio. في هذا المثال ، يمكنك معرفة كيفية تنفيذ طلبات الشبكة على Kotlin وكيفية استخدام مكتبة OkHttp 3.


سوف تأتي الحقائق من قاعدة بيانات للحقائق حول Chuck Norris ، والتي تقدم واجهة برمجة تطبيقات بسيطة للحقائق العشوائية.


إضافة التبعية لـ OkHttp


لإجراء مكالمات عبر الشبكة ، سنستخدم مكتبة OkHttp. لذلك ، نحتاج إلى إضافة تبعية OkHttp 3.10 إلى ملف 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' } 

تخصيص Android Manifest


أيضًا ، لإجراء مكالمات عبر شبكة ، نحتاج إلى إضافة إذن INTERNET إلى بيان تطبيقنا:


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

إنشاء واجهة المستخدم


الخطوة التالية هي إنشاء واجهة مستخدم لتطبيقنا. سوف نستخدم ConstraintLayout كمكون أساسي للتخطيط.


في الجزء العلوي من واجهة المستخدم الخاصة بنا سيكون ImageView مع وجه تشاك نوريس:


تشاك نوريس


ثم نضيف TextView التي سوف نعرض فيها حقيقة تشاك نوريس. بالنسبة إلى TextView نعرّف التبعية ، التي تقع أسفل ImageView . بعد ذلك ، أضف زرًا يتيح للمستخدمين تنزيل حقيقة جديدة ، وطلبها من قاعدة البيانات. أخيرًا ، أضف ProgressBar ، والذي سيتم توسيطه على الشاشة.


نتيجة لذلك ، نحصل على التصميم التالي لواجهة المستخدم الخاصة بنا:


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

اختبار API


قبل كتابة التعليمات البرمجية في MainActivity نقوم باختبار الاستجابة التي تم إرجاعها بواسطة API قاعدة البيانات. سنتصل بالعنوان التالي: https://api.icndb.com/jokes/random .


تعمل خدمة الويب هذه بشكل عشوائي على إرجاع حقيقة جديدة حول Chuck Norris في كل مكالمة. بإدخال عنوان URL في متصفح الويب ، ستحصل على النتيجة التالية:


نتيجة استدعاء API


لذلك ، سوف نحتاج إلى تحليل استجابة JSON للوصول إلى خاصية المزاح ، والتي تحتوي على الحقيقة التي نحتاجها.


كتابة كود Kotlin ل MainActivity


الآن حان الوقت لكتابة رمز MainActivity . نحدد متغيرًا نخزن فيه عنوان URL لنقطة نهاية واجهة برمجة التطبيقات الذي سنقوم بالاتصال به. ثم نحن إنشاء مثيل OkHttpClient .


في طريقة onCreate MainActivity ، نحتاج فقط إلى تعيين OnClickListener على زر يتيح للمستخدمين تنزيل حقائق جديدة حول Chuck Norris.


يتم loadRandomFact API في طريقة loadRandomFact الخاصة. نعرض ProgressBar قبل الوصول إلى الشبكة. ثم نقوم بإنشاء كائن Request بعنوان URL لنقطة النهاية في المعلمة.


بعد ذلك ، ندعو طريقة newCall على OkHttpClient ، لتمرير Request كمعلمة إليه. لمعالجة الاستجابة ، ندعو طريقة enqueue مع مثيل Callback في المعلمة.


في طريقة onResponse نحصل على استجابة ثم JSONObject بإنشاء JSONObject . والخطوة الأخيرة هي الحصول على خاصية نكتة لكائن القيمة . بعد ذلك ، يمكننا عرض حقيقة Chuck Norrim في TextView خلال تغليف كل شيء في كتلة runOnUiThread لضمان تحديث واجهة المستخدم في مؤشر ترابط واجهة المستخدم.


نتيجة لذلك ، حصلنا على الرمز التالي لـ MainActivity لتطبيق 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) } } }) } } 

قم بتشغيل التطبيق


أفضل جزء من الدرس. عند بدء تشغيل التطبيق ، ستحصل على النتيجة التالية:


تطبيق جاهز

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


All Articles