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

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


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


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


We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies).

You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.

Ok