public class CCardViewForItem extends Fragment {
private AppCompatTextView nameCard;
private View rootView;
private LinearLayoutCompat containerLayout;
private FragmentTransaction transaction;
private AppCompatImageButton btnAdd;
private Bundle bundle;
private RoomDB db;
@SuppressLint("CheckResult")
@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater,
@Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.c_card_for_item, container, false);
transaction = getChildFragmentManager().beginTransaction();
nameCard = rootView.findViewById(R.id.c_text_view_name_card);
containerLayout = rootView.findViewById(R.id.c_card_view_container);
btnAdd = rootView.findViewById(R.id.create_menu_btn_add_item_menu);
/**обращаемся к бд, чтобы получить расписание приёма пищи*/
db = SRoomDB.getInstance().getRoomDB();
bundle = getArguments();
if (bundle != null)
nameCard.setText(bundle.getString("timeFood"));
if (savedInstanceState == null) {
if (bundle.getString("date") != null) {
/**востанавливает меню*/
Maybe<List<MenuHistoryFoodDay>> maybe = db.getHistoryFoodDayDAO()
.getDay(bundle.getString("date"), bundle.getInt("number_card"))
.subscribeOn(Schedulers.io());
maybe.subscribe(list -> {
if (list.size() != 0) {
for (int i = 0; list.size() > i; ++i) {
CItemMenu itemMenu = new CItemMenu();
/**Создаём Bundle и запихивает всё инфу во fragment*/
Bundle bundleItemMenu = new Bundle();
bundleItemMenu.putInt("_id", list.get(i)._id);
bundleItemMenu.putInt("id_product", list.get(i).id_product);
bundleItemMenu.putFloat("size_product", list.get(i).size_product);
bundleItemMenu.putString("date", list.get(i).date);
String tag = String.valueOf(GenerateId.generateViewId());
itemMenu.setArguments(bundleItemMenu);
transaction.add(R.id.c_card_view_container, itemMenu, tag);
}
}
});
}
}
/**вызывает активити ItemSelectActivity*/
btnAdd.setOnClickListener(view -> {
Intent intent = new Intent(getContext(), ItemSelectActivity.class);
intent.putExtra("number_card", bundle.getInt("number_card"));
startActivity(intent);
});
return rootView;
}
/**
* Удалить item в меню
*/
@Subscribe
public void removeFragment(EventRemoveFragment event) {
FragmentManager fm = getChildFragmentManager();
Fragment fr = fm.findFragmentByTag(event.tag);
if (fr != null) {
transaction = fm.beginTransaction();
transaction.remove(fr).commit();
}
}
/**
* Добавить item в меню Разобрать, добавлять в бд, при развёртывании добавлять в бд
*/
@Subscribe
public void addItemMenu(EventAddItemCardView event) {
if (event.getNumberCard() == bundle.getInt("number_card")) {
CItemMenu itemMenu = new CItemMenu();
/**tag - нужен, чтобы удалять запись*/
String tag = String.valueOf(GenerateId.generateViewId());
transaction.add(R.id.c_card_view_container, itemMenu, tag);
itemMenu.setData(event.getId_product(), event.getSize(), bundle.getInt("number_card"));
}
}
@Override
public void onStart() {
super.onStart();
if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this);
/**Дабы не ловить проблем с добавлением детей, пока не видимс активи
* commit будет общий тут*/
if (!transaction.isEmpty()) {
transaction.commit();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (EventBus.getDefault().isRegistered(this))
EventBus.getDefault().unregister(this);
}
}
if (!transaction.isEmpty())если мы раз сделали commit, то эта условие всегда почему-то возвращает true после этого. И приложение работает до тех пор, пока при срабатывании onStart в transaction есть новая транзакция.
wipe data/factory reset
инфа снесётся, но мож аппарат очнётся