- Содержание
- Часть работы
- Список литературы
- Вопросы/Ответы
СОДЕРЖАНИЕ
СОДЕРЖАНИЕ 5
ВВЕДЕНИЕ 7
1 АНАЛИЗ И МОДЕЛИРОВАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ ПРИЛОЖЕНИЯ 8
1.1 ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ 8
1.2 МОДЕЛИРОВАНИЕ ВАРИАНТОВ ИСПОЛЬЗОВАНИЯ 9
1.3 СЛОВАРЬ ПРЕДМЕТНОЙ ОБЛАСТИ ПРИЛОЖЕНИЯ 11
1.4 МОДЕЛИРОВАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ 11
2 ТЕХНИЧЕСКОЕ ЗАДАНИЕ 13
2.1 ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ 13
2.2 НАЗНАЧЕНИЕ РАЗРАБОТКИ 13
2.3 ТРЕБОВАНИЯ К ПРОГРАММЕ ИЛИ ПРОГРАММНОМУ ИЗДЕЛИЮ 13
2.3.2 ТРЕБОВАНИЯ К ВХОДНЫМ И ВЫХОДНЫМ ДАННЫМ 13
2.3.3 ТРЕБОВАНИЯ ПОЛЬЗОВАТЕЛЯ К ИНТЕРФЕЙСУ 14
2.3.4 ТРЕБОВАНИЯ К НАДЕЖНОСТИ 15
2.3.5 УСЛОВИЯ ЭКСПЛУАТАЦИИ 15
2.3.6 ТРЕБОВАНИЯ К СОСТАВУ И ПАРАМЕТРАМ ТЕХНИЧЕСКИХ СРЕДСТВ 15
2.3.7 ТРЕБОВАНИЯ К ИНФОРМАЦИОННОЙ И ПРОГРАММНОЙ СОВМЕСТИМОСТИ 15
2.4 ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ 16
2.5 СТАДИИ И ЭТАПЫ РАЗРАБОТКИ 16
2.6 ПОРЯДОК КОНТРОЛЯ И ПРИЕМКИ 16
3 ТЕХНИЧЕСКИЙ ПРОЕКТ 17
3.1 МОДЕЛИРОВАНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ ДЕЙСТВИЙ 17
3.3 ОПИСАНИЕ СТРУКТУР И ФОРМАТОВ ДАННЫХ 18
3.4 СХЕМА АЛГОРИТМОВ 19
4 РАБОЧИЙ ПРОЕКТ 20
4.1 СПЕЦИФИКАЦИЯ КОМПОНЕНТОВ И КЛАССОВ ПРОГРАММ 20
4.1.1 ОПИСАНИЕ ОБЪЕКТОВ ИНТЕРФЕЙСА ПРОГРАММЫ 22
4.1.2 ОПИСАНИЕ КЛАССОВ 36
4.2 ТЕСТИРОВАНИЕ ПРОГРАММНОЙ СИСТЕМЫ 39
ЗАКЛЮЧЕНИЕ 40
CПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 41
ПРИЛОЖЕНИЕ A 43
ПРИЛОЖЕНИЕ Б 65
Фрагмент для ознакомления
getAdapterPosition();if (position != RecyclerView.NO_POSITION) {listener.onItemClick(v, position); } } } }); } @Overridepublic void onBindGroupViewHolder(CatalogViewHolder holder, intflatPosition,ExpandableGroup group) {holder.setTitle(group); }public Object getItem(int position) {ExpandableListPositionelp = expandableList.getUnflattenedPosition(position);return expandableList.groups.get(elp.groupPos).getItems().get(elp.childPos); }public Catalog getCatalog(intflatPos) {ExpandableListPositionelp = expandableList.getUnflattenedPosition(flatPos);return (Catalog)expandableList.groups.get(elp.groupPos); }public void updateList(final List list) {this.originalItems = list; List groups = (ArrayList extends ExpandableGroup>) this.originalItems;getGroups().clear();getGroups().addAll(groups);notifyDataSetChanged(); }}packagecom.example.catbooks.ui.catalogs;importandroid.app.Dialog;importandroid.os.Bundle;importandroid.view.View;importandroid.view.Window;importandroid.view.WindowManager;importandroid.widget.EditText;importandroidx.appcompat.app.AlertDialog;importandroidx.fragment.app.DialogFragment;importandroidx.lifecycle.Observer;importandroidx.lifecycle.ViewModelProvider;importcom.example.catbooks.R;importcom.example.catbooks.db.Catalog;importcom.example.catbooks.model.CatBooksViewModel;importcom.example.catbooks.utils.Utils;public class CatalogDialog extends DialogFragment {privateUtils.OnCloseDialogListener listener;public void setListener(Utils.OnCloseDialogListener listener) {this.listener = listener; }private static final String TAG = CatalogDialog.class.getSimpleName();private Catalog catalog;privateEditTextedtCatalogName;privateCatBooksViewModelcatBooksViewModel; @Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {catBooksViewModel =newViewModelProvider(getActivity()).get(CatBooksViewModel.class);catalog = (Catalog) getArguments().getSerializable("catalog");AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_catalog, null);edtCatalogName = (EditText) view.findViewById(R.id.edtCatalogName);if(catalog != null) {edtCatalogName.setText(catalog.getName()); }catBooksViewModel.getNameCatalog().observe(getActivity(), new Observer() { @Overridepublic void onChanged(String item) {if(item != null)edtCatalogName.setText(item); } });view.findViewById(R.id.btnYes).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {if(catalog != null) {catalog.setName(edtCatalogName.getText().toString()); }dismiss(); } });view.findViewById(R.id.btnNo).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {catalog = null;dismiss(); } });edtCatalogName.requestFocus();builder.setView(view); Dialog dialog = builder.create();dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);return dialog; } @Overridepublic void onStop() {super.onStop();if(listener != null && catalog != null)listener.OnCloseDialog(getActivity(), catalog); }}packagecom.example.catbooks.ui.catalogs;import static com.example.catbooks.ui.catalogs.CatalogAdapter.DOUBLE_CLICK_TIME_DELTA;import static com.example.catbooks.ui.catalogs.CatalogAdapter.lastClickTime;importandroid.app.Activity;importandroid.content.Context;importandroid.os.Bundle;importandroid.view.LayoutInflater;importandroid.view.Menu;importandroid.view.MenuInflater;importandroid.view.MenuItem;importandroid.view.View;importandroid.view.ViewGroup;importandroidx.annotation.NonNull;importandroidx.appcompat.widget.SearchView;importandroidx.fragment.app.Fragment;importandroidx.fragment.app.FragmentManager;importandroidx.fragment.app.FragmentTransaction;importandroidx.lifecycle.ViewModelProvider;importandroidx.recyclerview.widget.DefaultItemAnimator;importandroidx.recyclerview.widget.LinearLayoutManager;importandroidx.recyclerview.widget.RecyclerView;importcom.example.catbooks.MainActivity;importcom.example.catbooks.R;importcom.example.catbooks.databinding.FragmentCatalogsBinding;importcom.example.catbooks.db.Book;importcom.example.catbooks.db.Catalog;importcom.example.catbooks.db.SQLiteDB;importcom.example.catbooks.utils.Utils;import com.google.android.material.floatingactionbutton.FloatingActionButton;import com.thoughtbot.expandablerecyclerview.listeners.OnGroupClickListener;importjava.util.List;public class CatalogsFragment extends Fragment {private static final String TAG = CatalogsFragment.class.getSimpleName();;privateCatalogsViewModelcatalogsViewModel;privateFragmentCatalogsBinding binding;privateSQLiteDBdb;privateRecyclerViewrecyclerView;privateCatalogAdapter adapter;privateFloatingActionButton fab;private List items;public View onCreateView(LayoutInflaterinflater, ViewGroup container, Bundle savedInstanceState) {catalogsViewModel =newViewModelProvider(this).get(CatalogsViewModel.class);binding = FragmentCatalogsBinding.inflate(inflater, container, false); View root = binding.getRoot();db = SQLiteDB.getInstance(getActivity());setHasOptionsMenu(true);recyclerView = (RecyclerView) root.findViewById(R.id.recyclerCatalogs);recyclerView.setLayoutManager(new LinearLayoutManager(root.getContext()));recyclerView.setHasFixedSize(true);RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();if (animator instanceofDefaultItemAnimator) { ((DefaultItemAnimator) animator).setSupportsChangeAnimations(false); }items = db.getCatalogList();adapter = new CatalogAdapter(getContext(), items);recyclerView.setAdapter(adapter);adapter.setOnItemClickListener(new Utils.OnItemClickListener() { @Overridepublic void onItemClick(View itemView, int position) { Book book = (Book) adapter.getItem(position);ShowBookDialog(book); } });adapter.setOnGroupClickListener(new OnGroupClickListener() { @OverridepublicbooleanonGroupClick(intflatPos) {longclickTime = System.currentTimeMillis();if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){ShowCalalogDialog(adapter.getCatalog(flatPos));lastClickTime = 0; } else {adapter.toggleGroup(flatPos); }lastClickTime = clickTime;return false; } });return root; }public void ShowCalalogDialog(Catalog catalog) { Bundle bundle = new Bundle();bundle.putSerializable("catalog", catalog);CatalogDialogcatalogDialog = new CatalogDialog();catalogDialog.setListener(new Utils.OnCloseDialogListener() { @Overridepublic void OnCloseDialog(Activity activity, Object obj) { Catalog cat = (Catalog)obj;if(cat.getId() == 0) {db.insertCatalog(cat); } else {db.updateCatalog(cat); }items = db.getCatalogList();adapter.updateList(items); } });FragmentManager manager = getActivity().getSupportFragmentManager();FragmentTransaction transaction = manager.beginTransaction();catalogDialog.setArguments(bundle);catalogDialog.show(transaction, "catalogDialog"); }public void ShowBookDialog(Book book) { Bundle bundle = new Bundle();bundle.putSerializable("book", book);BookDialogbookDialog = new BookDialog();bookDialog.setListener(new Utils.OnCloseDialogListener() { @Overridepublic void OnCloseDialog(Activity activity, Object obj) { Book bk = (Book)obj;if(bk.getId() == 0) {db.insertBook(bk); } else {db.updateBook(bk); }items = db.getCatalogList();adapter.updateList(items); } });FragmentManager manager = getActivity().getSupportFragmentManager();FragmentTransaction transaction = manager.beginTransaction();bookDialog.setArguments(bundle);bookDialog.show(transaction, "bookDialog"); } @Overridepublic void onDestroyView() {super.onDestroyView();binding = null; } @Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflaterinflater) {super.onCreateOptionsMenu(menu, inflater);menu.clear();inflater.inflate(R.menu.main, menu);MenuItem item = menu.findItem(R.id.menu_search);SearchViewsearchView = new SearchView(((MainActivity) getContext()).getSupportActionBar().getThemedContext());item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM);item.setActionView(searchView);searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @OverridepublicbooleanonQueryTextSubmit(String query) {return false; } @OverridepublicbooleanonQueryTextChange(String newText) {adapter.getFilter().filter(newText);return true; } });searchView.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) { } } ); } @Overridepublic void onResume() {super.onResume();FloatingActionButton fab = (FloatingActionButton) getActivity().findViewById(R.id.fab);fab.show();fab.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View view) {ShowCalalogDialog(new Catalog("", null, 0)); } }); } @Overridepublic void onAttach(@NonNull Context context) {super.onAttach(context); }}packagecom.example.catbooks.ui.catalogs;importandroidx.lifecycle.LiveData;importandroidx.lifecycle.MutableLiveData;importandroidx.lifecycle.ViewModel;public class CatalogsViewModel extends ViewModel {privateMutableLiveData mText;publicCatalogsViewModel() {mText = new MutableLiveData<>();mText.setValue("This is home fragment"); }publicLiveData getText() {returnmText; }}packagecom.example.catbooks.ui.catalogs;import static android.view.animation.Animation.RELATIVE_TO_SELF;importandroid.view.View;importandroid.view.animation.RotateAnimation;importandroid.widget.ImageView;importandroid.widget.TextView;importcom.example.catbooks.R;importcom.example.catbooks.db.Catalog;importcom.thoughtbot.expandablerecyclerview.models.ExpandableGroup;import com.thoughtbot.expandablerecyclerview.viewholders.GroupViewHolder;public class CatalogViewHolder extends GroupViewHolder {privateTextViewcatalogName;privateImageView arrow;publicCatalogViewHolder(View itemView) {super(itemView);catalogName = (TextView) itemView.findViewById(R.id.itemCatalogName);arrow = (ImageView) itemView.findViewById(R.id.itemCatalogArrow); }public void setTitle(ExpandableGroup item) {if (item instanceof Catalog) {catalogName.setText(item.getTitle()); } } @Overridepublic void expand() {animateExpand(); } @Overridepublic void collapse() {animateCollapse(); }private void animateExpand() {RotateAnimation rotate =newRotateAnimation(360, 180, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f);rotate.setDuration(300);rotate.setFillAfter(true);arrow.setAnimation(rotate); }private void animateCollapse() {RotateAnimation rotate =newRotateAnimation(180, 360, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f);rotate.setDuration(300);rotate.setFillAfter(true);arrow.setAnimation(rotate); }}ПРИЛОЖЕНИЕББлок-схемыалгоритмаРисунок Б.1 – Блок-схема создания новой книги
CПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1) Ed Burnette Hello, Android; Уфа, ДизайнПолиграфСервис – Москва, 2019. – 228 c.
2) Ken Ford Android Epistemology; Перм. ун-т – Москва, 2018. – 334 c.
3) Sally E. Slack Android Companion; Struik Publishers – Москва, 2017. – 288 c.
4) Голощапов Алексей Google Android. Программирование для мобильных устройств; БХВ-Петербург – Москва, 2018. – 448 c.
5) Дэвид, Хэррон Node.js. Разработка серверных веб-приложений на JavaScript / Хэррон Дэвид. – М.: ДМК Пресс, 2018. – 405 c.
6) Дэрси Лорен, Кондер Шейн Android за 24 часа. Программирование приложений под операционную систему Google; Рид Групп – Москва, 2018. – 464 c.
7) Изучаем Node.js. – М.: Питер, 2018. – 400 c.
8) Кантелон, М. Node.js в действии / М. Кантелон. – М.: Питер, 2019. – 950 c.
9) Колисниченко Денис Программирование для Android. Самоучитель; БХВ-Петербург – Москва, 2018. – 272 c.
10) Майер Рето Android 4. Программирование приложений для планшетных компьютеров и смартфонов; Эксмо – Москва, 2019. – 816 c.
11) Медникс Зигард , Дорнин Лайрд , Мик Блэйк , Накамура Масуми Программирование под Android; Питер – Москва, 2018. – 560 c.
12) Немцова Т. И., Голова С. Ю., Абрамова И. В. Программирование на языке высокого уровня. Программирование на языке Object Pascal (+ CD-ROM); Форум, Инфра-М – Москва, 2019. – 496 c.
13) Ретабоуил Сильвен Android NDK. Разработка приложений под Android на С/С++; ДМК Пресс – Москва, 2017. – 496 c.
14) Хэррон, Дэвид Node.js Разработка серверных веб-приложений на JavaScript / Дэвид Хэррон. – М.: ДМК Пресс, 2018. – 630 c.
15) Цехнер Марио Программирование игр под Android; Питер – Москва, 2018. – 688 c.
Вопрос-ответ:
Для чего нужно мобильное приложение для создания каталога домашней библиотеки?
Мобильное приложение для создания каталога домашней библиотеки позволяет организовать и упорядочить коллекцию книг, а также удобно искать нужные книги в своей библиотеке.
Какие возможности предоставляет мобильное приложение для создания каталога домашней библиотеки?
Мобильное приложение позволяет добавлять книги в каталог, указывать основные характеристики каждой книги (название, автор, год выпуска и проч.), а также создавать пользовательские теги и добавлять книгам заметки. Приложение также предоставляет возможность искать книги по различным параметрам и сортировать их.
Как осуществляется поиск книг в мобильном приложении для создания каталога домашней библиотеки?
Поиск книг в приложении осуществляется по различным параметрам, таким как название, автор, жанр, год выпуска и прочие характеристики. Пользователь может ввести ключевые слова или выбрать определенные параметры для поиска, после чего приложение выдаст результаты соответствующие запросу.
Можно ли добавить собственные категории и теги в мобильное приложение для создания каталога домашней библиотеки?
Да, в приложении можно создать собственные категории и теги для организации книг в каталоге. Это позволяет пользователю более удобно структурировать свою коллекцию и быстро находить нужные книги.
Какие требования к программе или программному изделию предъявляются в мобильном приложении для создания каталога домашней библиотеки?
Требования к программе включают в себя удобный и интуитивно понятный интерфейс, стабильную работу без сбоев и ошибок, возможность синхронизации с облачными сервисами для сохранения данных, возможность экспорта и импорта каталога. Также программное изделие должно быть совместимо с различными операционными системами и устройствами.
Какое приложение рассматривается в статье?
В статье рассматривается мобильное приложение для создания каталога домашней библиотеки.
Для каких устройств доступно это приложение?
Это приложение доступно для мобильных устройств.
Какие задачи решает данное приложение?
Данное приложение помогает создавать каталог домашней библиотеки и упорядочивать коллекцию книг.
Какие требования предъявляются к программе или программному изделию?
К программе предъявляются требования по работе с входными и выходными данными, а также требования пользователя.
Какой основной функционал имеет приложение?
Основной функционал приложения заключается в создании и управлении каталогом домашней библиотеки.
Для чего предназначено мобильное приложение для создания каталога домашней библиотеки?
Мобильное приложение предназначено для упорядочивания и удобного управления своей домашней библиотекой. С помощью этого приложения пользователь может добавлять книги в каталог, отслеживать свои прочитанные и непрочитанные книги, делать заметки и отзывы, а также проводить поиск по своим книгам.
Какие требования к входным и выходным данным у мобильного приложения для создания каталога домашней библиотеки?
У мобильного приложения для создания каталога домашней библиотеки требуется, чтобы входные данные содержали информацию о добавляемых книгах, такую как название, автор, издательство, год издания и ISBN. Выходные данные представляют собой отображение книг в каталоге, включая информацию о каждой книге, такую как статус (прочитана или непрочитана), заметки и отзывы пользователя.