Laboratoriya ishi №5 Planshet va telefonda ilova ko‘rinishini yaratish. Ishdan maqsad: Planshet va telefonda ilovalar uchun interfeys yaratish. Laboratoriyaning nazariy qismi. Ko‘pgina ilovalarda siz ilova muallifiga xabar yuborish uchun fikr-mulohaza shaklini ko‘rishingiz mumkin, garchi, albatta, bu ko‘pincha Google Play-dagi sharhlar orqali amalga oshiriladi. Ammo shunga qaramay, bu fikr-mulohaza shakli ham foydali bo‘lishi mumkin va bugun biz uni qanday yaratishni bilib olamiz. Shaklni yaratish jarayonida biz EditText, Spinner, Checkbox kabi elementlar bilan ishlashni eslaymiz (yoki o‘rganamiz),tugmasi. Shunday qilib, biz dastur haqida fikrmulohazalarimiz yoki ilova yaratuvchisiga uning elektron pochtasiga takliflarimiz bilan xat yuborish oynasini tasvirlaydigan dastur yaratamiz. Darhol shuni ta'kidlash kerakki, dastur xabarlarni jo‘natmaydi, biz shunchaki shunga o‘xshash shaklni qanday qilishni va yuqoridagi elementlar bilan ishlashni o‘rganamiz, lekin biz boshqa darsda xabarni yuborish jarayonini ko‘rib chiqamiz. Biz yaratamizyangi dastur, odatdagidek, nomlar sukut bo‘yicha qoldirilishi mumkin yoki siz o‘zingizning biror narsangizni kiritishingiz mumkin. Faoliyatni tanlang Blank Activity. Birinchidan, foydalanuvchilardan qanday ma'lumotlarni olishni xohlayotganimizni ko‘rib chiqaylik. Biz foydalanuvchi nomini, elektron pochta manzilini, javob turini, masalan, maqtov, shikoyat, taklif yoki xato hisoboti, xabar matni va foydalanuvchiga xabar yetkazilganligi haqida javob berish funksiyasini kiritishi uchun maydonlarni qo‘shamiz. xavfsiz. Juda oz ish emas, lekin juda ko‘p ham emas. Ilova interfeysini yaratishdan boshlaylik. Biz dasturning kelajakdagi barcha elementlarini ScrollView tegiga joylashtiramiz, shuning uchun dastur barcha elementlarni turli ekran o‘lchamlarida normal ko‘rsatishiga amin bo‘lamiz. Activity_main.xml faylida quyidagi kodni qo‘shing: <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="schemas.android.com/apk/res/android" android: id="@+id/ScrollView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="vertikal"> <LinearLayout android:layout_width="fill_parent" android:orientation="vertikal" android:layout_height="fill_parent"> </LinearLayout> </ScrollView> Endi bu erda kerakli elementlarni qo‘shishni boshlaylik. Keling, TextView elementini qo‘shamiz, unda oyna nomi va foydalanuvchi o‘z xabarini yuborish taklifi ko‘rsatilgan matn ko‘rsatiladi. Ushbu elementdagi matn @string resurslari orqali o‘rnatilishi kerak, lekin biz faqat maydon nomini qo‘lda kiritamiz: <TextView android: id="@+id/TextViewTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Fikr-mulohaza yuborish oynasi" android: textSize="14pt"> </TextView> Laboratoriyaning amaliy qismi. Endi biz EditText elementini yaratishimiz kerak, unda foydalanuvchi o‘z ismini kiritishi mumkin. Keling, ushbu elementni EditTextName deb ataymiz. Ushbu maydonga nima kiritish kerakligini aniq bo‘lishi uchun biz maslahat, maslahat buyrug‘idan foydalanamiz. Shunga qaramay, men barcha matnni qo‘lda kiritish og‘rig‘idan o‘tdim, bu juda aqlli emas, siz buni yaxshilashingiz va strings.xml faylida barcha kerakli satrlarni yaratishingiz mumkin. Shunday qilib, EditText qo‘shamiz: <Matnni tahrirlash android: id="@+id/EditTextName" android:layout_height="wrap_content" android:hint="Ismni kiriting" android:inputType="textPersonName" android:layout_width="fill_parent"> </Text> Keling, yana bir EditText elementini qo‘shamiz, unda foydalanuvchi o‘z elektron pochta manzilini kiritishi kerak bo‘ladi. Maydonni EditTextEmail deb nomlaymiz, xuddi oldingi elementdagi kabi, ushbu maydonga nima kiritish kerakligi haqida maslahat qo‘shing: <Matnni tahrirlash android: id="@+id/EditTextEmail" android:layout_height="wrap_content" android:hint="E-pochtangizni kiriting" android:inputType="textEmailAddress" android:layout_width="fill_parent"> </Text> Keyinchalik, Spinner nomli elementni yaratamiz, bu bizga yuborish uchun xabar turini tanlash imkonini beradi, xoh u maqtov, shikoyat, taklif yoki xato haqida hisobot. Keling, bu Spinner elementini SpinnerFeedbackType deb ataymiz. Birinchidan, biz strings.xml fayliga o‘tishimiz va u erda Spinner'dagi tanlov elementlari uchun mas'ul bo‘lgan qatorlarni qo‘shishimiz kerak. strings.xml faylini oching va u erga quyidagilarni qo‘shing: <string name="feedbacktype">Xabar turi</string> <string name="feedbacktype1">Maqtov</string> <string name="feedbacktype2">Shikoyat</string> <string name="feedbacktype3">Taklif</string> <string name="feedbacktype4">Xatolik hisoboti</string> Endi biz string massivini yaratishimiz kerak. Res/values papkasida arrays.xml nomli yangi fayl yarating va unga quyidagilarni qo‘shing: <?xml version="1.0" encoding="utf-8"?> <resurslar> <string-array name="feedbacktypelist"> <item>@string/feedbacktype1</item> <item>@string/feedbacktype2</item> <item>@string/feedbacktype3</item> <item>@string/feedbacktype4</item> </string-array> </ resurslar> Yuqoridagi amallardan so‘ng biz nihoyat Spinnerimizni yaratishga tayyormiz: <Spinner android: id="@+id/SpinnerFeedbackType" android:layout_height="wrap_content" android:prompt="@string/feedbacktype" android:layout_width="fill_parent" android:entries="@array/feedbacktypelist"> </Spinner> Yaratilgan Spinner elementining to‘g‘ridan-to‘g‘ri ostida siz foydalanuvchi o‘z xabari matnini kiritadigan boshqa EditText maydonini yaratishingiz kerak. Keling, ushbu elementni chaqiraylikEditTextFeedbackBody, shuningdek, maslahat sozlangishorakiritiladigan matn turi haqida. Javob matnini kiritishda foydalanuvchiga ko‘proq joy va erkinlik berish uchun buyruqni o‘rnatingkirish turiustidatextMultiLineva qatorlar sonini 5 ga o‘rnating: <Matnni tahrirlash android: id="@+id/EditTextFeedbackBody" android:layout_height="wrap_content" android:hint="Xabar matnini kiriting" android:inputType="textMultiLine" android:lines="5" android:layout_width="fill_parent"> </Text> Keyinchalik, ilovamizga element qo‘shishimiz kerakbelgilash katagi, unda foydalanuvchidan o‘z xabari manzilga muvaffaqiyatli etib kelganligi to‘g‘risida xabar olishni xohlaydimi yoki yo‘qligini tanlash so‘raladi: <Tekshiruv qutisi android: id="@+id/CheckBoxResponse" android:layout_height="wrap_content" android:text="Javob bermoqchimisiz?" android:layout_width="fill_parent"> </CheckBox> Laboratoriya ishlarini bajarish uchun topshiriqlar. a. Belgilar qatori berilgan. Satrdagi so‘zlar bir-biridan bitta bo‘sh joy bilan ajratiladi. Satrdan eng uzun so‘zni olib tashlang. b. Belgilar qatori berilgan. Satrdagi so‘zlar bir-biridan bitta bo‘sh joy bilan ajratiladi. Satrdan eng qisqa so‘zni olib tashlang. c. Belgilar qatori berilgan. Satrdagi so‘zlar bitta bo‘sh joy bilan ajratiladi. d. Eng uzun va eng qisqa so‘zni almashtiring. e. Bir nechta so‘zlardan iborat qator berilgan. So‘zlar bir-biridan bo‘sh joy yoki vergul bilan ajratiladi. Berilgan raqamdan uzunroq so‘zlar sonini hisoblang. Laboratoriya ishi №6 Mobil ilovalarda geolokatsiya bilan ishlash. Ish maqsadi: JSON-dan foydalanishni o‘rganish. Laboratoriyaning nazariy qismi. Retrofit - bu dastur server bilan ishlashi kerak bo‘lganda foydalaniladigan mashhur va qulay kutubxona. Ushbu maqolada men u bilan ishlashning asoslarini ko‘rib chiqish uchun juda oddiy misoldan foydalanaman. Aytaylik, ba'zi serverda ma'lumotlar mavjud. Va server bizga bu ma'lumotlarni berishga tayyor. Buning uchun eng ko‘p ishlatiladigan format json. Mana shunday ma'lumotlarga misol:https://rawgit.com/startandroid/data/master/messages/messages1.json Ushbu fayldan ma'lumotlarni ilovaga olish uchun Retrofit-dan foydalanamiz. Keling, bir oz nazariya bilan boshlaylik. Qayta tiklash konfiguratsiyasini ikki qismga bo‘lish mumkin: API interfeysi va quruvchi. Keling, kim nima uchun javobgar ekanligini batafsil ko‘rib chiqaylik. Ilova ma'lumotlarini server bilan almashish ishini tasavvur qiling. Bu qanday sodir bo‘ladi? Odatda server bizga qandaydir API bilan ta'minlaydi, ya'ni. usullar to‘plami (aka REST). Agar, masalan, bu onlayn-do‘kon serveri bo‘lsa, uning API quyidagi usullarni o‘z ichiga olishi mumkin: getProducts- mahsulotlar ro‘yxatini oling getProdut- mahsulot haqida batafsil ma'lumot olish getOrders- buyurtmalar ro‘yxatini oling Buyurtma oling- buyurtma haqida batafsil ma'lumot olish Buyurtma yaratish- buyurtmalar yaratish va boshqalar. Bular server usullari va ularni chaqirish uchun biz quyidagi kabi ko‘rinishi mumkin bo‘lgan so‘rovlarni bajarishimiz kerak: http://server/api/v1/getProducts http://server/api/v1/getProduct http://server/api/v1/getOrders http://server/api/v1/getOrder http://server/api/v1/createOrder va hokazo. Bular. serverda ba'zi bir asosiy URL bor - http://server/api/v1/. Va API usullari bilan ishlash uchun havolalarni olish uchun unga usul nomlari oddiygina qo‘shiladi (getProducts, getOrders va boshqalar). Biz dasturga qaytamiz. Bizning ilovamizda getProducts, getOrders va boshqalar usullari bilan ServerApi klassi bo‘lsa, juda qulay bo‘lar edi. Va bu usullar chaqirilganda, tegishli server usullari chaqiriladi. Va Retrofit biz uchun shunday sinfni yaratishi mumkin. Bizga kerakli usullarni yozadigan interfeys kerak bo‘ladi. Mana shunday interfeysga misol: umumiy interfeys ServerApi { @GET("getProducts") List<Mahsulot> getProducts(); @GET("getProduct") Product getProduct(uzoq mahsulot identifikatori); @GET("GetOrders") List<Buyurtma> getOrders(); @GET("getOrder") Buyurtma getOrder(uzoq orderId); @POST("Buyurtma yaratish") void createOrder(Buyurtma buyurtmasi); } Ushbu kod biroz soddalashtirilgan. Haqiqiy misolda qo‘shimcha izohlar va o‘ramlar bo‘ladi. Ammo bu umumiy ma'noni anglatadi. Retrofit ushbu interfeysni amalga oshiradigan sinfni yaratadi. Ushbu sinf ichida serverga qo‘ng‘iroqlar yaratiladi. Va biz ushbu interfeysda usul nomlarini va ba'zi HTTP narsalarni o‘rnatishimiz mumkin, masalan, o‘tkazilgan parametrlar (So‘rov), sarlavhalar (sarlavha) va boshqalar. getProducts usulining tavsifini batafsilroq ko‘rib chiqing: @GET("getProducts") List<Mahsulot> getProducts(); GET izohi getProducts uchun HTTP so‘rovi bir turdagi bo‘lishi kerakligini anglatadiOLISH. Va bu izoh uchun parametr sifatida biz serverdagi usul nomini ko‘rsatishimiz kerak. E'tibor bering, asosiy URL (http://server/api/v1/) bu erda ko‘rinmaydi. Biz buni keyinroq, quruvchida aniqlaymiz. List<Mahsulot> - bu qaytarish turi. Retrofitning o‘zi json ma'lumotlarini Mahsulot ob'ektlari ro‘yxatiga aylantira oladi. Quruvchini muhokama qilishda biz bu haqda batafsilroq gaplashamiz. Xo‘sh, usulning nomi getProducts() dir. Ushbu misolda u serverdagi usul nomiga mos keladi. Lekin bu ixtiyoriy. Bular. shunday qilishingiz mumkin @GET("getProducts") List<Mahsulot> getProductList(); Endi usul nomlari boshqacha. Koddagi getProductList usulini chaqirasiz va serverda getProducts chaqiriladi. Keling, amaliyotga o‘tamiz. Retrofit loyihangizda, build.gradle faylida foydalanish uchun bog‘liqliklar bo‘limiga bog‘liqliklarni qo‘shing: "com.squareup.retrofit2:retrofit:2.3.0" kompilyatsiya qiling "com.squareup.retrofit2:converter-gson:2.3.0" kompilyatsiya qiling Birinchi qator - Retrofitning o‘zi, ikkinchi qator esa uning Gson konvertoridir. Sizga havola borligini eslatib o‘taman:https://rawgit.com/startandroid/data/master/messages/messages1.json. U bizga json ma'lumotlarini qaytaradi, bu xabarlar ro‘yxati. Har bir xabarda identifikator, vaqt, matn va ba'zan rasm maydonlari mavjud. Bu havola, albatta, API emas, balki faqat matnli fayl, lekin ma'no bir xil bo‘lib qoladi, faqat usul nomi o‘rniga bizda fayl nomi bo‘ladi. Biz havolani ikki qismga ajratamiz: "https://rawgit.com/startandroid/data/master/messages/" - asosiy URL (quruvchida ko‘rsatiladi) "messages1.json" - fayl nomi (da ko‘rsatiladi) interfeys, GET izohlarida) Laboratoriyaning amaliy qismi. Ushbu havola bilan ishlash uchun interfeys yaratishimiz mumkin. Faqat bitta usul bo‘ladi va u List<Xabar>ni qaytaradi. Avval Message sinfini yaratamiz. umumiy sinf xabari { shaxsiy uzun identifikator; shaxsiy uzoq vaqt; xususiy String matni; xususiy string tasvir; // oluvchilar va sozlashchilar ... } Uning maydonlari messages1.json ma'lumotlaridagi maydonlarga mos keladi. Endi biz interfeysni yaratamiz: import java.util.List; import retrofit2.Call; import retrofit2.http.GET; umumiy interfeysi MessagesApi { @GET("messages1.json") Chaqiruv<Ro‘yxat<Xabar>> xabarlari(); } GET izohida biz kerakli havolani olish uchun asosiy URL manziliga "messages1.json" qo‘shilishi kerakligini bildiramiz. Qo‘ng‘iroqqa e'tibor bering. Ushbu o‘ram Retrofit ishlashi uchun kerak. Unda biz messages1.json dan qanday turdagi ma'lumotlarni olishni kutayotganimizni ko‘rsatamiz - ya'ni. Ro‘yxat<Xabar>. Interfeys yaratildi, endi quruvchiga o‘tamiz: Retrofit retrofit = yangi Retrofit.Builder() .baseUrl("https://rawgit.com/startandroid/data/master/messages/") .addConverterFactory(GsonConverterFactory.create()) .qurmoq(); Quruvchida biz asosiy URL manzilini belgilaymiz va Gson konvertorini qo‘shamiz, shunda Retrofit o‘zi json ma'lumotlarini Xabar ob'ektlariga aylantira oladi. Bu bizning oddiy misolimiz uchun zarur bo‘lgan minimal sozlama. Murakkab holatlar uchun parametrlar soni ko‘proq bo‘lishi mumkin. Natijada, bizda asosiy URL manzili va Gson yordamida json maʼlumotlarini oʻzgartirish imkoniyati mavjud Retrofit obyekti mavjud. Biz uni usullar tasvirlangan interfeys sinfini yaratish usuliga o‘tkazamiz. MessagesApi messagesApi = retrofit.create (MessagesApi.class); Va biz MessagesApi dasturini Retrofit-dan olamiz. Ushbu ilova quruvchi sozlamalarini (asosiy URL va Gson konvertori) va interfeysdagi usullarning tavsiflarini (mess1.json faylini olish uchun xabarlar usuli) birlashtiradi. Natijada, Retrofit quruvchidan asosiy URL-manzilni oladi, unga interfeysdagi GET-da biz ko‘rsatgan yo‘lning qolgan qismini biriktiradi va shu bilan to‘liq havolani oladi. Ehtimol, nima uchun funksionallikni quruvchi va interfeysga ajratish kerak edi degan savol tug‘iladi. Amaliyotimdan bir nechta misol keltirishim mumkin. 1) Onlayn do‘konda ikkita server mavjud: ishlaydigan (haqiqiy ma'lumotlar bilan) va test. Ikkalasi ham bir xil API-ga ega. Va server bilan aloqa qiladigan dastur mavjud. Ilovaning disk raskadrovka versiyasi test serveri bilan ishlashi va u haqidagi barcha ma'lumotlarni jurnalga yozib qo‘yishi kerak. Chiqarish versiyasi ishlab chiqarish serveri bilan ishlaydi va jurnalga hech narsa chiqarmaydi. Debug va Release versiyalari o‘rtasidagi bu farq ikki xil quruvchilar bilan amalga oshirilishi mumkin. Biz faqat turli xil asosiy URL manzillarini va ular uchun turli jurnal sozlamalarini belgilaymiz. Va ikkala holatda ham interfeys bir xil ishlatiladi. 2) API bilan server mavjud. Va bu usullarni chaqiradigan dastur mavjud. Avtorizatsiya serverda amalga oshiriladi. Bular. ilova avtorizatsiya usulini chaqirishi, token olishi va keyin foydalanuvchi bilan bog‘langan ba'zi API usullarini chaqirganda ushbu tokendan foydalanishi kerak. Quruvchi barcha qo‘ng‘iroqlarga token qo‘shadigan maxsus ishlov beruvchidan foydalanish imkoniyatiga ega. Lekin biz hammaga emas, faqat ba'zi qo‘ng‘iroqlarga token qo‘shishimiz kerak. Laboratoriya ishlarini bajarish uchun topshiriqlar. 1. {aij} (1< i<n, 1< j<n) butun kvadrat matritsasi berilgan. Asosiy diagonal ostida joylashgan matritsa komponentlari orasidagi eng kichik qiymatni hisoblaydigan dastur tuzing. 2. {aij} (1< i<n, 1< j<n) butun kvadrat matritsasi berilgan. Asosiy diagonal ustida joylashgan matritsa komponentlari hisoblaydigan dastur tuzing. orasidagi eng kichik qiymatni 3. {aij} (1< i<n, 1< j<n) butun kvadrat matritsasi berilgan. Asosiy diagonal ostida joylashgan matritsa komponentlari orasidagi eng katta qiymatni hisoblaydigan dastur tuzing. 4. {aij} (1< i<n, 1< j<n) butun kvadrat matritsasi berilgan. Asosiy diagonal ustida joylashgan matritsa komponentlari orasidagi eng katta qiymatni hisoblaydigan dastur yozing. 5. Amaliy san'at muzeyi dasturini ishlab chiqish