Продолжим изучать использование фрагментов при написании программ для Android, и сегодня напишем приложение - расписание уроков для школы.
Содержание:
Описание макетов
Для создания нашего приложения я предлагаю использовать две активности и пять фрагментов. Aivity_main.xml будет содержать шесть кнопок, 6-11 классы, activity_main11.xml будет являться контейнером для фрагментов fragment_main11.xml -fragment_main15.xml.
Разметка activity_main.xml:
<!--?xml version="1.0" encoding="utf-8"?--> <android.support.constraint.constraintlayout 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="match_parent" tools:context="ru.maxfad.myraspisanie.MainActivity"> <relativelayout android:layout_width="match_parent" android:layout_height="match_parent"> <button android:id="@+id/button11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentstart="true" android:layout_alignparenttop="true" android:layout_marginstart="15dp" android:layout_margintop="134dp" android:text="@string/button11" tools:layout_editor_absolutex="7dp" tools:layout_editor_absolutey="131dp"></button> <button android:id="@+id/button10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/button11" android:layout_alignbottom="@+id/button11" android:layout_marginstart="22dp" android:layout_toendof="@+id/button11" android:text="@string/button10" tools:layout_editor_absolutex="0dp" tools:layout_editor_absolutey="0dp"></button> <button android:id="@+id/button9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/button10" android:layout_alignbottom="@+id/button10" android:layout_marginstart="21dp" android:layout_toendof="@+id/button10" android:text="@string/button9"></button> <button android:id="@+id/button8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignstart="@+id/button11" android:layout_below="@+id/button11" android:layout_margintop="38dp" android:text="@string/button8"></button> <button android:id="@+id/button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/button8" android:layout_alignbottom="@+id/button8" android:layout_alignstart="@+id/button10" android:text="@string/button7"></button> <button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/button7" android:layout_alignbottom="@+id/button7" android:layout_alignstart="@+id/button9" android:text="@string/button6"></button> </relativelayout> </android.support.constraint.constraintlayout>
Разметка activity_main11.xml:
<!--?xml version="1.0" encoding="utf-8"?--> <android.support.design.widget.coordinatorlayout 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:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitssystemwindows="true" tools:context="ru.maxfad.myraspisanie.Main11Activity"> <android.support.design.widget.appbarlayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingtop="@dimen/appbar_padding_top" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:layout_weight="1" android:background="?attr/colorPrimary" app:layout_scrollflags="scroll|enterAlways" app:popuptheme="@style/AppTheme.PopupOverlay" app:title="@string/app_name"> </android.support.v7.widget.toolbar> <android.support.design.widget.tablayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.tabitem android:id="@+id/tabItem" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tab_text_1"> <android.support.design.widget.tabitem android:id="@+id/tabItem2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tab_text_2"> <android.support.design.widget.tabitem android:id="@+id/tabItem3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tab_text_3"> <android.support.design.widget.tabitem android:id="@+id/tabItem4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tab_text_4"> <android.support.design.widget.tabitem android:id="@+id/tabItem5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tab_text_5"> </android.support.design.widget.tabitem> </android.support.design.widget.tabitem> </android.support.design.widget.tabitem> </android.support.design.widget.tabitem> </android.support.design.widget.tabitem> </android.support.design.widget.tablayout> </android.support.design.widget.appbarlayout> <android.support.v4.view.viewpager android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.design.widget.floatingactionbutton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="@dimen/fab_margin" app:srccompat="@android:drawable/ic_dialog_email"> </android.support.design.widget.floatingactionbutton> </android.support.v4.view.viewpager> </android.support.design.widget.coordinatorlayout>
Разметка fragment_main11.xml - fragment_main15.xml особо ничем не отличается друг от друга:
<android.support.constraint.constraintlayout 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:id="@+id/constraintLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ru.maxfad.myraspisanie.Main11Activity$PlaceholderFragment"> <textview android:id="@+id/section_label" android:layout_width="138dp" android:layout_height="112dp" android:layout_margintop="@dimen/activity_vertical_margin" android:text="f1" app:layout_constraintleft_toleftof="parent" app:layout_constrainttop_totopof="@+id/constraintLayout" tools:layout_constraintleft_creator="1" tools:layout_constrainttop_creator="1"></textview> <linearlayout android:layout_width="375dp" android:layout_height="450dp" tools:layout_editor_absolutex="1dp" tools:layout_editor_absolutey="53dp"> <listview android:id="@+id/list11" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" tools:layout_editor_absolutex="0dp" tools:layout_editor_absolutey="51dp"></listview> </linearlayout> </android.support.constraint.constraintlayout>
Код MainActivity
Для осуществления открытия второй активности, в MainActivity.java необходимо объявить переменные для кнопок, которые находятся в activity_main.xml
Button button11,button10,button9,button8,button7,button6;
В функции onCreate свяжем кнопки с нашими переменными
button11=(Button)findViewById(R.id.button11); button10=(Button)findViewById(R.id.button10); button9=(Button)findViewById(R.id.button9); button8=(Button)findViewById(R.id.button8); button7=(Button)findViewById(R.id.button7); button6=(Button)findViewById(R.id.button6);
Теперь напишем обработчики нажатия на кнопки, по желанию можно установить Toast уведомление, показывающее для какого класса открыто расписание
button11.setOnClickListener(new
OnClickListener()
{
@Override
public void onClick(View v)
{
//Toast.makeText(getBaseContext(),"Класс 11",Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.setClass(MainActivity.this,Main11Activity.class);
Bundle b = new Bundle();
b.putString("classID","11");
intent.putExtras(b);
startActivity(intent);
}
});
В этом коде для открытия контейнера фрагментов применим Intent, так же во вторую активность через new Bundle(), putString("classID", "11") , intent.putExtras() мы передаем classID чтобы узнать, какая кнопка была нажата, это позволит загружать расписание для каждого класса по дням недели.
Вторая активность - контейнер для фрагментов
В этой активности мы будем принимать переданный параметр classID со значением номера класса в функции onCreate в одноименную переменную типа String, и выведем ее в заголовок активности для наглядности
classID=bundle.getString("classID");
toolbar.setTitle("Класс: "+classID);
Используем код из предыдущего урока "Создание фрагментов и использование вкладок для Android", а функцию getItem для отображения фрагментов в активности
switch(position){
case 0:
fragment_main11 bf1= new fragment_main11();
return bf1;
case 1:
fragment_main12 bf2= new fragment_main12();
return bf2;
case 2:
fragment_main13 bf3= new fragment_main13();
return bf3;
case 3:
fragment_main14 bf4= new fragment_main14();
return bf4;
case 4:
fragment_main15 bf5= new fragment_main15();
return bf5;
default:
return null;
}
при нажатии на вкладки с названием дня недели в ней будет отображаться нужный нам фрагмент.
String-array в файле string.xml
Кто забыл где находится файл string.xml напоминаю "app\src\main\res\values"
<string name="tab_text_1">ПН</string> <string name="tab_text_2">ВТ</string> <string name="tab_text_3">СР</string> <string name="tab_text_4">ЧТ</string> <string name="tab_text_5">ПТ</string>
Займемся заполнением строковых массивов String-array в файле string.xml, так как у нас шесть классов (11-6), а расписание предполагает пятидневную учебную неделю с понедельника по пятницу нам придется сделать 30 массивов, по 4 четыре урока в день,
<string-array name="uroki11_pn"> <item>физра</item> <item>математика</item> <item>биология</item> <item>музыка</item> </string-array> <string-array name="uroki11_vt"> <item>физика</item> <item>химия</item> <item>биология</item> <item>математика</item> </string-array>
имя массива uroki11_vt означает, что это 11 класс, день недели вторник.
Array Adapter для фрагментов
Итак, мы плавно подошли к завершающей фазе написания расписания уроков - это загрузка во фрагменты данных из массивов. У нас есть пять фрагментов, fragment_main11() означает, что в нем будет происходить загрузка данных для всех понедельников, fragment_main12() для вторников и так далее.
Снова будем использовать classID для понимания, какая кнопка была нажата и для какого класса отображать расписание. Опять объявим переменную тип String classID, и в функцию onCreate напишем код получения параметра
Bundle bundle =getActivity().getIntent().getExtras();
classID = bundle.getString("classID");
Объявим наш ListAdapter adapter, для сбора информации из массивов и, используя конструкцию switch (classID), получим для каждого класса отдельно расписание уроков понедельника во фрагмент fragment_main11.xml
switch(classID){
case "11":
adapter=new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1,
getResources().getStringArray(R.array.uroki11_pn));
setListAdapter(adapter);
break;
case "10":
adapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1,
getResources().getStringArray(R.array.uroki10_pn));
setListAdapter(adapter);
break;
case "9":
adapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1,
getResources().getStringArray(R.array.uroki9_pn));
setListAdapter(adapter);
break;
case "8":
adapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1,
getResources().getStringArray(R.array.uroki8_pn));
setListAdapter(adapter);
break;
case "7":
adapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1,
getResources().getStringArray(R.array.uroki7_pn));
setListAdapter(adapter);
break;
case "6":
adapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1,
getResources().getStringArray(R.array.uroki6_pn));
setListAdapter(adapter);
break;
}
Код следующих фрагментов будет отличаться только именем строкового массива, в fragment_main12() имена массивов будут заканчиваться не на _pn(понедельник) а на _vt(вторник) соответственно.

Однако, данный пример может быть использован для передачи информации, которая либо не меняется, либо меняется крайне редко и обновление данных будет происходить глобально, вместе с приложением через PlayMarket.
К примеру, вместо кнопок на главной форме может быть перечень заболеваний, а во фрагментах, связанных с этим пунктом могут загружаться симптомы, лекарства, рекомендации и тому подобное. Все зависит от вашей фантазии и назначения.
В следующих статьях я вернусь к этому приложению и продемонстрирую, как вместо Array Adapter и массивов использовать базу данных SQLite3, вносить корректировки и добавлять, изменять записи.
Cкачать архив для ознакомления - проект Расписание для уроков:
Создание расписания уроков для андроид Часть 1
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Создание расписания уроков для андроид Часть 1
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на видео ВКонтакте, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Создание расписания уроков для андроид Часть 1
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в Рутубе, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!