Продолжим изучать использование фрагментов при написании программ для 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(вторник) соответственно.

Создание расписания уроков для андроид устройств. Array Adapter для фрагментов. Итак, можно запускать эмулятор, нажав на кнопку с номером класса, вы увидите информацию о расписании уроков на неделю. Естественно, данный пример не обладает гибкостью и не предполагает внесения, изменения или удаления данных.


Однако, данный пример может быть использован для передачи информации, которая либо не меняется, либо меняется крайне редко и обновление данных будет происходить глобально, вместе с приложением через PlayMarket.
К примеру, вместо кнопок на главной форме может быть перечень заболеваний, а во фрагментах, связанных с этим пунктом могут загружаться симптомы, лекарства, рекомендации и тому подобное. Все зависит от вашей фантазии и назначения.

В следующих статьях я вернусь к этому приложению и продемонстрирую, как вместо Array Adapter и массивов использовать базу данных SQLite3, вносить корректировки и добавлять, изменять записи.

Cкачать архив для ознакомления - проект Расписание для уроков:



Видео обзор Создание расписания уроков для андроид устройств:

Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!

 С уважением, авторы сайта Компьютерапия


Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!


Связанные статьи


Cookies make it easier for us to provide you with our services. With the usage of our services you permit us to use cookies.
Ok