КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Дополнительная информация. Рекомендации по освоениюРекомендации по освоению Для успешной работы с Android приложением «Расписание студента» необходимо: Ø Получить навыки работы с операционной системой Android; Ø Ознакомиться с данным руководством пользователя. В данной программе используется собственность Yandex, а именно Yandex.API электрички, доступное для образовательных целей. Для получения расписания электричек мы отправляем GET запроса на данный API и получаем ответ в формате JSON в которому будет содержаться вся нужная информация о рейсах. Далее происходит обработка ответа и формирования списка ближайших электричек. Списки корпусов и автобусов добавлены в приложение статически в связи с чрезвычайно редкими случаями обновления данной информации. В процессе создания данного приложения мною были изучены методы создания intent’ов и передачи данных между ними, а также работа с форматом данных JSON, а также его обработки. Также получены навыки создание динамических интерфейсов под OS Android, данная программа будет выглядеть достаточно приемлемо для экранов различных размеров.
Фрагменты кода программы: Код MainActivity – реализует главное окно со всеми расписаниями Библиотеки import java.io. … import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Map; … /* Активити реализующее экран вывода расписаний электричек и автобусов согласно настройкам и выбору пользователя */ public class MainActivity extends ActionBarActivity { Button stationTV; ListView list, busList; boolean flag, fromMoscow; int t, b; URL url; /* константы */ final String ATTRIBUTE_NAME_STATIONS = "stationFrom"; final String ATTRIBUTE_NAME_TIMEDUR = "time duratation"; final String ATTRIBUTE_NAME_TIMEDEP = "time departure"; final String ATTRIBUTE_NAME_TIMEAR = "time arrival"; final String ATTRIBUTE_NAME_STOPS = "stops"; final String ATTRIBUTE_NAME_BUSFROM = "busfrom"; final String ATTRIBUTE_NAME_BUSTO = "busto"; final String ATTRIBUTE_NAME_BUSSESFROM = "bussesfrom"; final String ATTRIBUTE_NAME_BUSSESTO = "bussesto"; final String LOG_TAG = "GG_LOG"; /* массивы данных о станциях электричек и автобусов */ String[] stations; String stationTo; String[] timeDep, timeAr, timeDur; String[] stops; String[] bussesFrom, bussesTo; /* опредения переменных для даты и времени */ Date cur = new Date(); DateFormat dateF = new SimpleDateFormat("yyyy-MM-dd"); MyTime currentTime; /* Идентификаторы станция отправления и прибытия для электричек */ int stationToID, stationFromID; /* Идентефикаторы текущего выбора */ int curBusID = -1, curTrainID = -1; /* массивы длительностей автобусов и электричек */ int busDur[], trainDur[]; int destDur; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); stationTV = (Button) findViewById(R.id.stationTV); stationTV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /* обработчик нажатия на кнопку вызывающий выпадающее меню */ showPopupMenu(view); } }); /* реализация всех массивов */ stations = new String[100]; timeDep = new String[100]; timeDur = new String[100]; timeAr = new String[100]; stops = new String[100]; bussesFrom = new String[100]; bussesTo = new String[100]; busDur = new int[100]; trainDur = new int[100]; DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); destDur = Integer.parseInt(getIntent().getStringExtra("destDur")); /* опредения текущего времени */ currentTime = new MyTime(dateFormat.format(cur)); switch(getIntent().getStringExtra("dorm")) { /* проверка типа движения переданного предыдущим активити*/ case "2": /* едем в Москву */ fromMoscow = false; stationFromID = 9600721; flag = true; break; case "1": /* едем из Москвы */ fromMoscow = true; stationToID = 9600721; flag = false; break; } } private URL createURL(int from, int to) { /* метод создания URL запроса согласно выбранных станция движения * для последущего получения данных от Yandex.API * */ URL newUrl = null; try { newUrl = new URL("https://api.rasp.yandex.net/v1.0/search/?apikey=23f8eee7-9f0e-4bfc-8d0c-25bb2805a951&format=json&from=s" + from + "&to=s" + to + "&lang=ru&page=1&date="+dateF.format(cur)); } catch (MalformedURLException e) { e.printStackTrace(); } return newUrl; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void fillShedule() { /* метод создания динамического списка расписания электрчиек */ if (t!= 0) { // упаковываем данные в понятную для адаптера структуру ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>( t); Map<String, Object> m; for (int i = 0; i < 5; i++) { m = new HashMap<String, Object>(); m.put(ATTRIBUTE_NAME_STATIONS, stations[i]); m.put(ATTRIBUTE_NAME_TIMEDUR, timeDur[i]); m.put(ATTRIBUTE_NAME_TIMEDEP, timeDep[i]); m.put(ATTRIBUTE_NAME_TIMEAR, timeAr[i]); m.put(ATTRIBUTE_NAME_STOPS, stops[i]); data.add(m); } // массив имен атрибутов, из которых будут читаться данные String[] from = {ATTRIBUTE_NAME_STATIONS, ATTRIBUTE_NAME_TIMEDUR, ATTRIBUTE_NAME_TIMEDEP, ATTRIBUTE_NAME_TIMEAR, ATTRIBUTE_NAME_STOPS}; // массив ID View-компонентов, в которые будут вставлять данные int[] to = {R.id.station, R.id.timeDur, R.id.timeDep, R.id.timeAr, R.id.stops}; // создаем адаптер SimpleAdapter sAdapter = new SimpleAdapter(this, data, R.layout.list_item, from, to); // определяем список и присваиваем ему адаптер list = (ListView) findViewById(R.id.list); list.setAdapter(sAdapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener(){ View tempView; @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { /* обработка нажатий на элементы списка для еденичного выбора одного из них */ if (curTrainID == -1) { curTrainID = i; tempView = view; tempView.setBackgroundColor(0x00A69030); tempView.setScaleY((float) 1.1); if(curBusID!= -1) { durInfo(curTrainID, curBusID); } } else { if (curTrainID!= i) { tempView.setBackgroundColor(0x00A6D9DC); tempView.setScaleY((float) 0.9); curTrainID = i; tempView = view; tempView.setBackgroundColor(0x00A69030); tempView.setScaleY((float) 1.1); } else { tempView.setBackgroundColor(0x00A6D9DC); tempView.setScaleY((float) 0.9); curTrainID = -1; }}}}); } else { /* если массив электриччеек пуст вывод сообщения о их отсутсвии */ Toast.makeText(this, "Нету вариантов...", Toast.LENGTH_LONG).show(); } if (flag) { try { fillBusesTo(); } catch (IOException e) { e.printStackTrace(); } } else { try { fillBusesFrom(); } catch (IOException e) { e.printStackTrace(); } } } private void showPopupMenu(View v) { /* метод реализующий выпаадющее меню по нажатию кнопки */ PopupMenu popupMenu = new PopupMenu(this, v); popupMenu.inflate(R.menu.popup); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { /* Создания четрых пунктов меню соответсвующих 4-м станциям электричек в москве */ switch (item.getItemId()) { case R.id.kuncevo: /* определяем станцию прибытия или отправления как Кунцево */ stationTV.setText("Кунцево"); //Log.d(LOG_TAG, "Кунцево id = 9601728"); stationTo = "Кунцево"; if (!fromMoscow) stationToID = 9601728; /* устанавливаем ID станции, как ID станции прибытия */ else stationFromID = 9601728; /* устанавливаем ID станции, как ID станции отправления*/ /* создаем URl согласно данным */ url = createURL(stationFromID, stationToID); /* вызываем метод вызова и последующей обработки запроса */ new ParseTask().execute(); return true; case R.id.phili: /* определяем станцию прибытия или отправления как Фили */ stationTV.setText("Фили"); //Log.d(LOG_TAG, "Фили id = 9600821"); stationTo = "Фили"; if (!fromMoscow) stationToID = 9600821; /* устанавливаем ID станции, как ID станции прибытия */ else stationFromID = 9600821; /* устанавливаем ID станции, как ID станции отправления */ /* создаем URl согласно данным */ url = createURL(stationFromID, stationToID); /* вызываем метод вызова и последующей обработки запроса */ new ParseTask().execute(); return true; case R.id.begovaya: /* определяем станцию прибытия или отправления как Беговая */ stationTV.setText("Беговая"); //Log.d(LOG_TAG, "Беговая id = 9601666"); stationTo = "Беговая"; if (!fromMoscow) stationToID = 9601666; /* устанавливаем ID станции, как ID станции прибытия */ else stationFromID = 9601666; /* устанавливаем ID станции, как ID станции отправления */ /* создаем URl согласно данным */ url = createURL(stationFromID, stationToID); /* вызываем метод вызова и последующей обработки запроса */ new ParseTask().execute(); return true; case R.id.belorus: /* определяем станцию прибытия или отправления как Белорусский */ stationTV.setText("Белорусский"); //Log.d(LOG_TAG, "Белорусский id = 2000006"); stationTo = "Белорусский"; if (!fromMoscow) stationToID = 2000006; /* устанавливаем ID станции, как ID станции прибытия */ else stationFromID = 2000006; /* устанавливаем ID станции, как ID станции отправления */ /* создаем URl согласно данным */ url = createURL(stationFromID, stationToID); /* вызываем метод вызова и последующей обработки запроса */ new ParseTask().execute(); return true; default: return false; } } });
popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() { @Override public void onDismiss(PopupMenu menu) { } }); popupMenu.show(); } private class ParseTask extends AsyncTask<Void, Void, String> { /* метод отправления запроса и получения ответа от Yandex.API */ HttpURLConnection urlConnection = null; BufferedReader reader = null; String resultJson = ""; @Override protected String doInBackground(Void... params) { // получаем данные с внешнего ресурса try { /* создание подключение по URL */ urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); StringBuffer buffer = new StringBuffer(); reader = new BufferedReader(new InputStreamReader(inputStream)); /* получаем ответ от сервера в формате JSON и записываем его в строчку */ String line; while ((line = reader.readLine())!= null) { buffer.append(line); } resultJson = buffer.toString(); //Log.d(LOG_TAG, "Result = " + resultJson); } catch (Exception e) { e.printStackTrace(); } return resultJson; } @Override protected void onPostExecute(String strJson) { super.onPostExecute(strJson); /* обрабатываем полученую строчку */ JSONObject dataJsonObj = null; /* Для обработки ответа API 1) Берем из JSON массив threads и записываем в соответствующую переменную 2) Берем время текущего автобуса расписания и если она нас удовлетворяет записываем данный автобус в массив 3) Вынимаем из массива threads нужные нам параметры электрички, такие как: а) Название рейса (Станция отпр. - Станция приб.) б) Время отправления в) Время прибытия г) Продолжитеьность пути д) Все остановки данного рейса */ try { //Log.d(LOG_TAG, "start parse"); dataJsonObj = new JSONObject(strJson); JSONArray threads = dataJsonObj.getJSONArray("threads"); //Log.d(LOG_TAG, "arr - " + threads.toString()); for(int i = 0; i < threads.length(); i++) { JSONObject thread = threads.getJSONObject(i); // Log.d(LOG_TAG, "thread + " + thread.toString()); MyTime tempTime = new MyTime(thread.getString("departure")); if (currentTime.isAfter(tempTime)) { stations[t] = thread.getJSONObject("thread").getString("title"); timeDep[t] = thread.getString("departure"); timeAr[t] = thread.getString("arrival"); timeDur[t] = "Продолжительность ≈ " + parseDur(thread.getString("duration"), true); trainDur[t] = Integer.parseInt(parseDur(thread.getString("duration"), false)); stops[t++] = thread.getString("stops"); } } /* вызывает метод заполнения массивов */ fillShedule();
} catch (JSONException e) { e.printStackTrace(); } } } private String parseDur(String toParse, boolean flag) { /* метод обработки времени получает минуты возвращает часы:минуты */ double time = (Double.parseDouble(toParse) / 60); int itime = (int) time; if (flag) return "0:"+itime; else return String.valueOf(itime); } private void fillBusesTo() throws IOException { /* метод заполенения динамического списка автобусов при движении в Москву */ /* читаем расписания автобусов из статического файла приложения */ InputStream inStream = getResources().openRawResource(R.raw.bydni); InputStreamReader sr = new InputStreamReader(inStream); // создаем буфер для чтения файла BufferedReader reader = new BufferedReader(sr); String str; // читаем данные в буфер while ((str = reader.readLine())!= null){ String[] temp = str.split(":"); int h, m; if(Character.isDigit(temp[0].charAt(0))) { h = Integer.parseInt(temp[0].trim()); } else { h = Integer.parseInt(String.valueOf(temp[0].charAt(1))); } m = Integer.parseInt(temp[1].trim());Log.d(LOG_TAG,"m=" + temp[1]); MyTime tempTime = new MyTime(h,m); if (currentTime.isAfter(tempTime)) { bussesFrom[b] = temp[0] + ":" + temp[1]; if (!temp[2].equals("по")) { bussesTo[b++] = temp[2] + ":" + temp[3]; } else bussesTo[b++] = temp[2] + " " + temp[3]; } } inStream.close();
/* Создаем списки */ String busFrom = "Дубки", busTo = "Одинцово"; // упаковываем данные в понятную для адаптера структуру ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>( b); Map<String, Object> m; for (int i = 0; i < 3; i++) { m = new HashMap<String, Object>(); m.put(ATTRIBUTE_NAME_BUSFROM, busFrom); m.put(ATTRIBUTE_NAME_BUSTO, busTo); m.put(ATTRIBUTE_NAME_BUSSESFROM, bussesFrom[i]); m.put(ATTRIBUTE_NAME_BUSSESTO, bussesTo[i]); data.add(m); } // массив имен атрибутов, из которых будут читаться данные String[] from = {ATTRIBUTE_NAME_BUSFROM, ATTRIBUTE_NAME_BUSTO, ATTRIBUTE_NAME_BUSSESFROM, ATTRIBUTE_NAME_BUSSESTO}; // массив ID View-компонентов, в которые будут вставлять данные int[] to = {R.id.busfrom, R.id.busto, R.id.bussesfrom, R.id.bussesto}; // создаем адаптер SimpleAdapter sAdapter = new SimpleAdapter(this, data, R.layout.buslist_item, from, to); // определяем список и присваиваем ему адаптер busList = (ListView) findViewById(R.id.busList); busList.setAdapter(sAdapter); busList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ View tempView; @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { if(curBusID == -1) { /* обработка нажатий на элементы списка для еденичного выбора одного из них */ curBusID = i; tempView = view; tempView.setBackgroundColor(0x00A69030); tempView.setScaleY((float) 1.1); if(curTrainID!= -1) { durInfo(curTrainID, curBusID); } } else { if (curBusID!= i) { tempView.setBackgroundColor(0x00A6D9DC); curBusID = i; tempView.setScaleY((float) 0.9); tempView = view; tempView.setBackgroundColor(0x00A69030); tempView.setScaleY((float) 1.1); } else { tempView.setBackgroundColor(0x00A6D9DC); tempView.setScaleY((float) 0.9); curBusID = -1; } } } }); } private void fillBusesFrom() throws IOException { /* метод заполенения динамического списка автобусов при движении в Москву */ /* читаем расписания автобусов из статического файла приложения */ InputStream inStream = getResources().openRawResource(R.raw.bydni); InputStreamReader sr = new InputStreamReader(inStream); // создаем буфер для чтения файла BufferedReader reader = new BufferedReader(sr); String str; boolean flazhok = false; // читаем данные в буфер while ((str = reader.readLine())!= null){ String[] temp = str.split(":"); int h, m; if(Character.isDigit(temp[0].charAt(0))) { h = Integer.parseInt(temp[0].trim()); } else { h = Integer.parseInt(String.valueOf(temp[0].charAt(1))); } m = Integer.parseInt(temp[1].trim());Log.d(LOG_TAG,"m=" + temp[1]); MyTime tempTime = new MyTime(h,m); if (currentTime.isAfter(tempTime)) { bussesFrom[b++] = temp[2] + ":" + temp[3]; } } inStream.close(); String busFrom = "Одинцово", busTo = "Дубки"; // упаковываем данные в понятную для адаптера структуру ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>( b); Map<String, Object> m; for (int i = 0; i < 3; i++) { m = new HashMap<String, Object>(); m.put(ATTRIBUTE_NAME_BUSFROM, busFrom); m.put(ATTRIBUTE_NAME_BUSTO, busTo); m.put(ATTRIBUTE_NAME_BUSSESFROM, bussesFrom[i]); data.add(m); } // массив имен атрибутов, из которых будут читаться данные String[] from = {ATTRIBUTE_NAME_BUSFROM, ATTRIBUTE_NAME_BUSTO, ATTRIBUTE_NAME_BUSSESFROM, ATTRIBUTE_NAME_BUSSESTO}; // массив ID View-компонентов, в которые будут вставлять данные int[] to = {R.id.busfrom, R.id.busto, R.id.bussesfrom, R.id.bussesto}; // создаем адаптер SimpleAdapter sAdapter = new SimpleAdapter(this, data, R.layout.buslist_item, from, to); // определяем список и присваиваем ему адаптер busList = (ListView) findViewById(R.id.busList); busList.setAdapter(sAdapter); busList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ View tempView; @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { if(curBusID == -1) { /* обработка нажатий на элементы списка для еденичного выбора одного из них */ curBusID = i; tempView = view; tempView.setBackgroundColor(0x00A69030); tempView.setScaleY((float) 1.1); if(curTrainID!= -1) { durInfo(curTrainID, curBusID); } } else { if (curBusID!= i) { tempView.setBackgroundColor(0x00A6D9DC); curBusID = i; tempView.setScaleY((float) 0.9); tempView = view; tempView.setBackgroundColor(0x00A69030); tempView.setScaleY((float) 1.1); } else { tempView.setBackgroundColor(0x00A6D9DC); tempView.setScaleY((float) 0.9); curBusID = -1; }}}});} private void durInfo(int trainID, int busID) { /* метод вычисляющий общую длительность пути согласно выбору пользоватля в данном активити и настройках и выводящий ее в соответсвубщее поле */ TextView durationTV = (TextView) findViewById(R.id.durationTV); durationTV.setText("Продолжительность = " + String.valueOf(trainDur[trainID] + destDur + 10)); } } listitem.xml - являющийся паттерном для элементов динамических списков <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp" android:orientation="horizontal"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginRight="35dp"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="13sp" android:id="@+id/timeDep" android:textColor="#21134B" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/timeAr" android:textColor="#21134B" android:textSize="13sp"/> </LinearLayout>
<LinearLayout android:layout_weight="3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:id="@+id/station" android:textColor="#21134B" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/timeDur" android:textColor="#21134B" android:textSize="16sp"/> </LinearLayout> <TextView android:layout_weight="2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/stops" android:gravity="end"/> </LinearLayout> Mainactivity.xml структура глваного экрана <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.gorazio.inc.raspisanie.MainActivity">
<LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textAlignment="center" android:id="@+id/stationTV" android:text="Выберите станцию" android:textSize="24sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/durationTV" android:hint="Продолжительность" android:textSize="24sp"/> </LinearLayout> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/busList"> </ListView><ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" </ListView></LinearLayout>
Дата добавления: 2015-08-31; Просмотров: 229; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |