مستندات جامع اندروید
نسخه 1.0.3
هدف از این بخش از پروژه، جستجوی نام خیابان ها و مکان های ثبت شده بر روی نقشه ، به وسیله سرویس جستجوی مکان محور نشان است. با استفاده از این سرویس ، بهترین نتایج ممکن پیرامون یک نقطه مشخص بدست می آید.
برای آشنایی سریع با وب سرویس جستجوی مکان محور نشان ، میتوانید از لینک زیر استفاده کنید
برای جستجوی یک عبارت حول یک طول و عرض جغرافیایی مشخص ، فرمت درخواست ما باید به صورت زیر و از نوع Get باشد:
برای مثال جستجوی کلمه آزادی حول طول و عرض جغرافیایی 59.543695 , 36.327371 (مشهد) به این صورت می باشد:
و پاسخ دریافت شده از سرور به صورت زیر می باشد:
{
"count": 30,
"items": [
{
"title": "بزرگراه آزادی",
"category": "municipal",
"type": "trunk",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله شهید فرامرز عباسی",
"location": {
"x": 59.54418939716518,
"y": 36.328338876612705,
"z": "NaN"
}
},
{
"title": "پل آزادی",
"address": "پل آزادی",
"category": "municipal",
"type": "trunk",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.54135775,
"y": 36.318429949999995,
"z": "NaN"
}
},
{
"title": "میدان آزادی",
"address": "میدان آزادی",
"category": "municipal",
"type": "roundabout",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.54038191808422,
"y": 36.31564164676244,
"z": "NaN"
}
},
{
"title": "زیرگذر میدان آزادی",
"address": "زیرگذر میدان آزادی",
"category": "municipal",
"type": "trunk",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.54059953955253,
"y": 36.315184051371986,
"z": "NaN"
}
},
{
"title": "میدان آزادی",
"address": "میدان آزادی",
"category": "municipal",
"type": "primary",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله ملک آباد",
"location": {
"x": 59.54140005973515,
"y": 36.314887754298844,
"z": "NaN"
}
},
{
"title": "کنارگذر بزرگراه آزادی",
"address": "کنارگذر پیامبر اعظم",
"category": "municipal",
"type": "secondary",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "شهرک امام هادی",
"location": {
"x": 59.54439154999999,
"y": 36.3531682,
"z": "NaN"
}
},
{
"title": "شهید حسن آزادی",
"address": "مجد 25 - قرنی 18/17",
"category": "municipal",
"type": "tertiary",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله سعدآباد",
"location": {
"x": 59.58923944280614,
"y": 36.308469070152775,
"z": "NaN"
}
},
{
"title": "پایگاه قطار شهری میدان آزادی",
"address": "میدان آزادی",
"category": "place",
"type": "vaccine",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله ملک آباد",
"location": {
"x": 59.54253804942464,
"y": 36.3140559482299,
"z": "NaN"
}
},
{
"title": "پاساژ فرش آزادی",
"address": "ایت الله خزعلی",
"category": "place",
"type": "shopping_mall",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله سراب",
"location": {
"x": 59.608517199999994,
"y": 36.292807100000005,
"z": "NaN"
}
},
{
"title": "خیابان کنارگذر آزادی",
"address": "خیابان کنارگذر آزادی",
"category": "municipal",
"type": "residential",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.54404234999999,
"y": 36.329699649999995,
"z": "NaN"
}
},
{
"title": "آژانس شبانه روزی آزادی",
"address": "بزرگراه آزادی",
"category": "place",
"type": "taxi_service",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.544172100000004,
"y": 36.330574399999996,
"z": "NaN"
}
},
{
"title": "خیابان کنارگذر آزادی",
"address": "خیابان کنارگذر آزادی",
"category": "municipal",
"type": "residential",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله سجاد شهر",
"location": {
"x": 59.54319050239321,
"y": 36.32326550047579,
"z": "NaN"
}
},
{
"title": "مجتمع نان آزادی",
"address": "بزرگراه آزادی، آزادی 24",
"category": "place",
"type": "bakery",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.54438534913283,
"y": 36.33176519346292,
"z": "NaN"
}
},
{
"title": "مجتمع نان آزادی",
"address": "بزرگراه آزادی، آزادی 24",
"category": "place",
"type": "bakery",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.54453329323038,
"y": 36.33179868787656,
"z": "NaN"
}
},
{
"title": "بیمه دانا شعبه آزادی",
"address": "بزرگراه آزادی",
"category": "place",
"type": "insurance_agency",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله ملک آباد",
"location": {
"x": 59.5418879,
"y": 36.3178947,
"z": "NaN"
}
},
{
"title": "سوپر مارکت آزادی",
"address": "بزرگراه آزادی، آزادی 44",
"category": "place",
"type": "supermarket",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله زیبا شهر",
"location": {
"x": 59.54611628611779,
"y": 36.33788119023024,
"z": "NaN"
}
},
{
"title": "آرایشگاه مردانه آزادی",
"address": "بلوار امامت، امامت 6",
"category": "place",
"type": "hair_care",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.53280338931937,
"y": 36.32112802605641,
"z": "NaN"
}
},
{
"title": "دکه روزنامه فروشی پایانه آزادی",
"address": "بلوار وکیل آباد",
"category": "place",
"type": "news_stand",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.534917,
"y": 36.317397699999994,
"z": "NaN"
}
},
{
"title": "میدان آزادی (فلکه پارک)",
"address": "پل آزادی",
"category": "place",
"type": "town_square",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله دانشگاه",
"location": {
"x": 59.540574324945034,
"y": 36.31507382936625,
"z": "NaN"
}
},
{
"title": "کارواش آزادی",
"address": "بلوار سید رضی، سیدرضی 46",
"category": "place",
"type": "car_wash",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله سیدرضی",
"location": {
"x": 59.521802111019156,
"y": 36.33803379099843,
"z": "NaN"
}
},
{
"title": "درب میدان آزادی پارک ملت",
"address": "زیرگذر میدان آزادی",
"category": "place",
"type": "entrance",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله آزادشهر",
"location": {
"x": 59.53974549478894,
"y": 36.31643569086812,
"z": "NaN"
}
},
{
"title": "ورودی مترو ایستگاه آزادی",
"address": "بلوار ملک آباد",
"category": "place",
"type": "metro_entrance",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله ملک آباد",
"location": {
"x": 59.54458236694337,
"y": 36.31272506713864,
"z": "NaN"
}
},
{
"title": "ورودی مترو ایستگاه آزادی",
"address": "بلوار ملک آباد",
"category": "place",
"type": "metro_entrance",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله نوفل لوشاتو",
"location": {
"x": 59.544410705566406,
"y": 36.31237030029296,
"z": "NaN"
}
},
{
"title": "آکادمی پارکور آزادی",
"category": "place",
"type": "stadium",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله ولیعصر",
"location": {
"x": 59.526407910792,
"y": 36.352386115982185,
"z": "NaN"
}
},
{
"title": "املاک آزادی",
"address": "بلوار معلم",
"category": "place",
"type": "real_estate_agency",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله دانشجو",
"location": {
"x": 59.501091845132436,
"y": 36.336599701370126,
"z": "NaN"
}
},
{
"title": "آشپزخانه آزادی",
"address": "حر عاملی",
"category": "place",
"type": "meal_delivery",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله حجت",
"location": {
"x": 59.58995038757027,
"y": 36.319777606051716,
"z": "NaN"
}
},
{
"title": "آزادی",
"address": "بلوار خواجه ربیع، خیابان شهید یوسف زاده، یوسف زاده 8، یوسف زاده 6/3",
"category": "place",
"type": "park",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله خواجه ربیع",
"location": {
"x": 59.634921299999995,
"y": 36.33853619999999,
"z": "NaN"
}
},
{
"title": "بوستان آزادی",
"address": "خیابان شهید یوسف زاده، یوسف زاده 12، یوسف زاده 6/3، یوسف زاده 6/7",
"category": "place",
"type": "park",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله خواجه ربیع",
"location": {
"x": 59.6351601,
"y": 36.33986519999999,
"z": "NaN"
}
},
{
"title": "دبستان آزادی (دولتی)",
"address": "بلوار سرافرازان، سرافرازان 28، رهایی3/7-رهایی3/2",
"category": "place",
"type": "formal_school",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله سرافرازان",
"location": {
"x": 59.50994229441166,
"y": 36.2952944312223,
"z": "NaN"
}
},
{
"title": "کلینیک ترک اعتیاد آزادی",
"address": "بلوار احمدآباد، پاستور",
"category": "place",
"type": "addiction_clinic",
"region": "مشهد، خراسان رضوی",
"neighbourhood": "محله بهشت",
"location": {
"x": 59.581735,
"y": 36.29528719999998,
"z": "NaN"
}
}
]
}
اینبار جستجوی کلمه آزادی ولی حول طول و عرض جغرافیایی 51.3355413 , 35.6999053 (تهران) به این صورت است:
و پاسخ دریافت شده از سرور به صورت زیر می باشد:
{
"count": 30,
"items": [
{
"title": "برج میدان آزادی",
"address": "میدان آزادی",
"category": "place",
"type": "point_of_interest",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.33806134577803,
"y": 35.699739812739935,
"z": "NaN"
}
},
{
"title": "میدان آزادی",
"address": "میدان آزادی",
"category": "municipal",
"type": "roundabout",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.33535615742,
"y": 35.700077048324,
"z": "NaN"
}
},
{
"title": "حوضچه میدان آزادی",
"address": "بزرگراه لشگری",
"category": "place",
"type": "interests",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.337430724562076,
"y": 35.69971719018604,
"z": "NaN"
}
},
{
"title": "آزادی",
"address": "آزادی",
"category": "municipal",
"type": "primary",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.34008459044491,
"y": 35.69990999018817,
"z": "NaN"
}
},
{
"title": "بیمارستان آزادی",
"address": "بزرگراه یادگار امام، میمنت",
"category": "place",
"type": "hospital",
"region": "تهران، استان تهران",
"neighbourhood": "محله زنجان جنوبی",
"location": {
"x": 51.357253789901726,
"y": 35.69693220935499,
"z": "NaN"
}
},
{
"title": "شیشه مینا (استادیوم آزادی)",
"address": "شیشه مینا (استادیوم آزادی)",
"category": "municipal",
"type": "primary",
"region": "تهران، استان تهران",
"neighbourhood": "شهرک فرهنگیان",
"location": {
"x": 51.28661275,
"y": 35.7155347,
"z": "NaN"
}
},
{
"title": "بلوار غربی ورزشگاه آزادی",
"address": "بلوار غربی ورزشگاه آزادی",
"category": "municipal",
"type": "primary",
"region": "تهران، استان تهران",
"neighbourhood": "محله ورزشگاه آزادی",
"location": {
"x": 51.26638533735376,
"y": 35.715470710176405,
"z": "NaN"
}
},
{
"title": "دریاچه ورزشگاه آزادی",
"category": "place",
"type": "interests",
"region": "تهران، استان تهران",
"neighbourhood": "محله ورزشگاه آزادی",
"location": {
"x": 51.27144328374694,
"y": 35.72759607802438,
"z": "NaN"
}
},
{
"title": "شیشه مینا (استادیوم آزادی)",
"address": "شیشه مینا (استادیوم آزادی)",
"category": "municipal",
"type": "roundabout",
"region": "تهران، استان تهران",
"neighbourhood": "محله ورزشگاه آزادی",
"location": {
"x": 51.268901835887775,
"y": 35.73609439859721,
"z": "NaN"
}
},
{
"title": "کنارگذر آزادی",
"address": "کنارگذر آزادی",
"category": "municipal",
"type": "secondary",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.34617884345915,
"y": 35.699779895418914,
"z": "NaN"
}
},
{
"title": "کنارگذر آزادی",
"address": "کنارگذر آزادی",
"category": "municipal",
"type": "secondary",
"region": "تهران، استان تهران",
"neighbourhood": "محله توحید",
"location": {
"x": 51.37248723329772,
"y": 35.70070062676796,
"z": "NaN"
}
},
{
"title": "آزادی",
"address": "کاشانی",
"category": "municipal",
"type": "secondary",
"region": "تهران، استان تهران",
"neighbourhood": "محله یافت آباد",
"location": {
"x": 51.34911402003776,
"y": 35.664506514701074,
"z": "NaN"
}
},
{
"title": "پارک آزادی",
"address": "آزادی، هوشیار، ابراهیمی، شورا سوم",
"category": "place",
"type": "park",
"region": "تهران، استان تهران",
"neighbourhood": "محله دکتر هوشیار",
"location": {
"x": 51.351514330734915,
"y": 35.6987029480465,
"z": "NaN"
}
},
{
"title": "شهدای آزادی",
"address": "آزادی، هوشیار، ابراهیمی",
"category": "place",
"type": "park",
"region": "تهران، استان تهران",
"neighbourhood": "محله دکتر هوشیار",
"location": {
"x": 51.35158347947666,
"y": 35.699200470180884,
"z": "NaN"
}
},
{
"title": "بوستان شهدای آزادی",
"address": "آزادی",
"category": "place",
"type": "park",
"region": "تهران، استان تهران",
"neighbourhood": "محله دکتر هوشیار",
"location": {
"x": 51.35164,
"y": 35.6998382,
"z": "NaN"
}
},
{
"title": "پارک آزادی",
"address": "فلکه اول صادقیه، رحیمی، اکرمی",
"category": "place",
"type": "park",
"region": "تهران، استان تهران",
"neighbourhood": "محله صادقیه",
"location": {
"x": 51.3410326,
"y": 35.719053499999994,
"z": "NaN"
}
},
{
"title": "مرکز خرید سپهر آزادی",
"address": "آزادی",
"category": "place",
"type": "shopping_mall",
"region": "تهران، استان تهران",
"neighbourhood": "محله نصرت",
"location": {
"x": 51.37975560000003,
"y": 35.700978199999966,
"z": "NaN"
}
},
{
"title": "برج نگین آزادی",
"address": "آزادی",
"category": "place",
"type": "commercial_complex",
"region": "تهران، استان تهران",
"neighbourhood": "محله نصرت",
"location": {
"x": 51.38094507823783,
"y": 35.70097434339961,
"z": "NaN"
}
},
{
"title": "موزه برج آزادی (تالار کهن)",
"address": "میدان آزادی",
"category": "place",
"type": "museum",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.33863560490706,
"y": 35.6997449384972,
"z": "NaN"
}
},
{
"title": "پست ۶۳ کیلوولت آزادی(مقر مانور آزادی)",
"address": "بزرگراه لشگری",
"category": "place",
"type": "local_government_office",
"region": "تهران، استان تهران",
"neighbourhood": "محله فرودگاه مهرآباد",
"location": {
"x": 51.330880524585574,
"y": 35.69898226038998,
"z": "NaN"
}
},
{
"title": "استادیوم آزادی",
"category": "place",
"type": "stadium",
"region": "تهران، استان تهران",
"neighbourhood": "محله ورزشگاه آزادی",
"location": {
"x": 51.2756365,
"y": 35.724463099999994,
"z": "NaN"
}
},
{
"title": "بوستان ورزشگاه آزادی",
"address": "بلوار غربی ورزشگاه آزادی، شیشه مینا (استادیوم آزادی)",
"category": "place",
"type": "park",
"region": "تهران، استان تهران",
"neighbourhood": "محله ورزشگاه آزادی",
"location": {
"x": 51.27605029999999,
"y": 35.727651200000004,
"z": "NaN"
}
},
{
"title": "پايگاه واکسیناسیون سیار اورژانس میدان آزادی",
"address": "بزرگراه لشگری",
"category": "place",
"type": "vaccine",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.33753659975725,
"y": 35.69980066074036,
"z": "NaN"
}
},
{
"title": "پست برق آزادی",
"address": "قزوین",
"category": "place",
"type": "local_government_office",
"region": "تهران، استان تهران",
"neighbourhood": "محله سلیمانی - تیموری",
"location": {
"x": 51.365921380672084,
"y": 35.667642426742376,
"z": "NaN"
}
},
{
"title": "پارکینگ برج آزادی",
"address": "بزرگراه لشگری",
"category": "place",
"type": "parking",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.336074520349364,
"y": 35.7007749384552,
"z": "NaN"
}
},
{
"title": "بازار روز آزادی",
"address": "بزرگراه لشگری",
"category": "place",
"type": "vegetable_market",
"region": "تهران، استان تهران",
"neighbourhood": "شهرک آپادانا",
"location": {
"x": 51.33357564013263,
"y": 35.70022499842319,
"z": "NaN"
}
},
{
"title": "ایستگاه پلیس کلانتری 135 آزادی",
"address": "بزرگراه لشگری",
"category": "place",
"type": "police",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.33712230469234,
"y": 35.7010645215458,
"z": "NaN"
}
},
{
"title": "رستوران بین المللی برج آزادی",
"address": "بزرگراه لشگری",
"category": "place",
"type": "restaurant",
"region": "تهران، استان تهران",
"neighbourhood": "محله استاد معین",
"location": {
"x": 51.33766840068348,
"y": 35.699730572703984,
"z": "NaN"
}
},
{
"title": "مسجد هفتاد و دو تن میدان آزادی",
"address": "بزرگراه لشگری، رحمانی",
"category": "place",
"type": "mosque",
"region": "تهران، استان تهران",
"neighbourhood": "شهرک آپادانا",
"location": {
"x": 51.33211998346048,
"y": 35.70004390331042,
"z": "NaN"
}
},
{
"title": "پست برق فوق توزیع آزادی",
"address": "بزرگراه لشگری",
"category": "place",
"type": "point_of_interest",
"region": "تهران، استان تهران",
"neighbourhood": "محله فرودگاه مهرآباد",
"location": {
"x": 51.33108767903619,
"y": 35.69885923888011,
"z": "NaN"
}
}
]
}
در این پروژه برای ارسال درخواست جستجو و دریافت نتیجه از SDK سرویس های نشان استفاده شده است.
AndroidManifest.xml
:
دسترسی زیر را برای استفاده از اینترنت به فایل مانیفست برنامه اضافه کنید:
<uses-permission android:name="android.permission.INTERNET"/>
activity_search.xml
:
در این صفحه علاوه بر المان نقشه ، یک EditText
برای نوشتن عبارت جستجو ، یکRecyclerView
برای نمایش لیست نتایج جستجو و دو ImageButton
وجود دارد که ImageButton
با id = show_markers_imageButton
برای نمایش نتایج جستجو بر روی نقشه به صورت مارکر استفاده میشود و ImageButton
با id = show_search_imageButton
برای نمایش نتایج جستجو در RecyclerView
استفاده میشود .
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="wrap_content"
tools:context=".activity.Search">
<org.neshan.mapsdk.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<EditText
android:id="@+id/search_editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
android:background="@drawable/edit_text_search_bg"
android:hint="جستجو"
android:imeOptions="actionSearch"
android:inputType="text"
android:textSize="16dp"/>
<ImageButton
android:id="@+id/show_markers_imageButton"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_below="@id/search_editText"
android:layout_marginTop="3dp"
android:layout_marginRight="15dp"
android:layout_toLeftOf="@+id/center_point"
android:background="@drawable/toggle_button_on_bg"
android:onClick="showMarkersClick"
app:srcCompat="@drawable/ic_marker_two"
android:tint="#ffffff" />
<TextView
android:id="@+id/center_point"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_below="@id/search_editText"
android:layout_centerHorizontal="true"
android:text="" />
<ImageButton
android:id="@+id/show_search_imageButton"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_below="@id/search_editText"
android:layout_marginLeft="15dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:layout_toRightOf="@+id/center_point"
android:background="@drawable/toggle_button_on_bg"
android:tint="#ffffff"
app:srcCompat="@drawable/ic_list_search"
android:onClick="showSearchClick"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/show_markers_imageButton"/>
</RelativeLayout>
SearchActivity.kt
:
متد initLayoutRefrences
برای دادن مقادیر اولیه به تمامی المانهای مربوط به رابط کاربری نوشته شدهاست.
همچنین Listenerهای مربوط به EditText
نیز در همین متد قرار دارد .
بعد از تغییر در متن EditText
، متد afterTextChanged
فراخوانی میشود که در این متد ، متد search
فراخوانی میشود تا درخواست جستجو ارسال و پاسخ آن دریافت شود.
با کلیک بر روی آیکون جستجوی کیبرد ، متد onEditorAction
فراخوانی میشود که در این متد نیز متد search
فراخوانی میشود .
// Initializing layout references (views, map and map events)
private fun initLayoutReferences() {
// Initializing views
initViews()
// Initializing mapView element
initMap()
//listen for search text change
editText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
search(s.toString())
Log.i(TAG, "afterTextChanged: $s")
}
})
editText.setOnEditorActionListener(object :TextView.OnEditorActionListener{
override fun onEditorAction(p0: TextView?, p1: Int, p2: KeyEvent?): Boolean {
if(p1 == EditorInfo.IME_ACTION_SEARCH){
closeKeyBoard()
search(editText.text.toString())
}
return false
}
})
}
در متد initViews
ارتباط بین View
های فایل activity_search.xml
و اشیای مربوطه در جاوا برقرار شده است.
// We use findViewByID for every element in our layout file here
private fun initViews() {
map = findViewById(R.id.mapview)
editText = findViewById(R.id.search_editText)
recyclerView = findViewById(R.id.recyclerView)
items = java.util.ArrayList()
adapter = SearchAdapter(items, this@SearchActivity)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
}
در متد initMap
یک موقعیت جغرافیایی ساخته می شود، سپس نقشه به این موقعیت منتقل شده و یک نشانگر نیز در این مکان اضافه می شود که نشان دهنده مکانی است که جستجو با محوریت آن انجام می شود.
private fun initMap() {
// Setting map focal position to a fixed position and setting camera zoom
val latLng = LatLng(35.767234, 51.330743)
map.moveCamera(latLng, 0f)
map.setZoom(14f, 0f)
centerMarker = Marker(latLng, getCenterMarkerStyle())
map.addMarker(centerMarker)
}
حالا به متد search
نگاه بیندازید .
این متد بعد از هر بار تغییر در EditText
در متد afterTextChanged
فراخوانی میشود . طول و عرض جغرافیایی وسط صفحه ، به عنوان طول و عرض جغرافیایی مرجع انتخاب میشود و centerMarker
در همین مکان نشان داده میشد تا مشخص شود جستجو پیرامون چه نقطه ای انجام شده است .
سپس با استفاده از متد Builder از کلاس NeshanSearch، پارامترهای ورودی وب سرویس مقدار دهی می شود و شی از نوع NeshanSearch با صدا زدن متد build ساخته می شود. حال با صدا زدن متد call این شی می توانیم وب سرویس را صدا زده و نتیجه آن را در Callback که به عنوان ورودی متد call تعریف کرده ایم دریافت کنیم.
در صورت موفقیت آمیز بودن دریافت پاسخ از سرور، onResponse فراخوانی می شود و بدنه ( body ) پارامتر response که از نوع NeshanSearchResult است شامل لیستی از کلاس Item
خواهد بود. برای نمایش لیست نتایج در RecyclerView
این لیست به متد updateList
فرستاده میشود
private fun search(term: String) {
val searchPosition: LatLng = map.getCameraTargetPosition()
updateCenterMarker(searchPosition)
NeshanSearch.Builder("service.oz8cfBdCEdmTv8qGx1835A1OPcVdq5DcTGgMN6z9")
.setLocation(searchPosition)
.setTerm(term)
.build().call(object : Callback<NeshanSearchResult?> {
override fun onResponse(
call: Call<NeshanSearchResult?>,
response: Response<NeshanSearchResult?>
) {
if (response.code() == 403) {
Toast.makeText(
this@SearchActivity,
"کلید دسترسی نامعتبر",
Toast.LENGTH_LONG
).show()
return
}
if (response.body() != null) {
val result = response.body()
items = result!!.items
adapter.updateList(items)
}
}
override fun onFailure(call: Call<NeshanSearchResult?>, t: Throwable) {
Log.i(TAG, "onFailure: " + t.message)
Toast.makeText(this@SearchActivity, "ارتباط برقرار نشد!", Toast.LENGTH_SHORT)
.show()
}
})
}
با کلیک بر روی ImageButton
با id = show_markers_imageButton
متد showMarkersClick
فراخوانی میشود . در این متد ، مکان های یافت شده به وسیله مارکرها بر روی نقشه نمایش داده میشوند و بعد از آن به وسیله متد moveToCameraBounds
میزان نمایش نقشه ، بر اساس محدوده مارکرهای روی نقشه تنظیم میشود .
متد moveToCameraBounds
به آبجکت از کلاس LatLngBounds
نیاز دارد که مقادیر مینیمم طول و عرض جغرافیایی و ماکسیمم طول و عرض جغرافیایی را که میخواهیم به عنوان محدوده نمایش نقشه در در نظر بگیریم به constructor کلاس Bound
میدهیم .
fun showMarkersClick(view: View) {
adapter.updateList(java.util.ArrayList())
closeKeyBoard()
clearMarkers()
var minLat = Double.MAX_VALUE
var minLng = Double.MAX_VALUE
var maxLat = Double.MIN_VALUE
var maxLng = Double.MIN_VALUE
for (item in items) {
val location = item.location
val latLng = location.latLng
markers.add(addMarker(latLng, 15f)!!)
minLat = Math.min(latLng.latitude, minLat)
minLng = Math.min(latLng.longitude, minLng)
maxLat = Math.max(latLng.latitude, maxLat)
maxLng = Math.max(latLng.longitude, maxLng)
}
if (items.isNotEmpty()) {
map.moveToCameraBounds(
LatLngBounds(LatLng(minLat, minLng), LatLng(maxLat, maxLng)),
ScreenBounds(
ScreenPos(0f, 0f),
ScreenPos(map.width.toFloat(), map.height.toFloat())
),
true, 0.5f
)
}
}
private fun clearMarkers() {
for (marker in markers) {
map.removeMarker(marker)
}
markers.clear()
}
با کلیک بر روی ImageButton
با id = show_search_imageButton
متد showSearchClick
فراخوانی میشود و دوباره RecyclerView
نمایش داده میشود .
fun showSearchClick(view: View?) {
closeKeyBoard()
adapter!!.updateList(items!!)
clearMarkers()
}
با کلیک بر روی هر یک از آیتم های RecyclerView
متد onSearchItemClick
فراخوانی میشود و مکان آیتم کلیک شده بر روی نقشه نمایش داده میشود . به کلاس SearchAdapter
و فایل item_search.xml
مراجعه کنید .
override fun onSearchItemClick(LatLng: LatLng?) {
closeKeyBoard()
clearMarkers()
adapter.updateList(java.util.ArrayList())
map.moveCamera(LatLng, 0f)
map.setZoom(16f, 0f)
addMarker(LatLng!!, 30f)
}