Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.