Uploaded by jemsbond007ditter

Laboratoriya ishi-5-6

advertisement
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
Download