@IvanOne

Как правильно организовать back stack fragments?

Всем привет помогите разобраться новичку в фрагментах. У меня есть фрагмент Список и есть фрагмент Формы добавления элемента в список. Я хочу сделать так что бы кнопка назад была только на фрагменте формы и вела на список.
вот коды фрагментов:
public class XeListFragment extends ListFragment {

    private FragmentManager fragmentManager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_xe_list, container, false);
        FloatingActionButton fabCreate = (FloatingActionButton) view.findViewById(R.id.createItem);
        fragmentManager = getActivity().getSupportFragmentManager();
        fabCreate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                AddItemFragment addFragment = new AddItemFragment();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.container, addFragment);

                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }
        });
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        CalcActivity activity = (CalcActivity) getActivity();
        activity.navigationView.setCheckedItem(R.id.nav_xe_list);
        ArrayList<XeData> list = activity.getXeData();
        XeAdapter adapter = new XeAdapter(activity, list);
        setListAdapter(adapter);
        if(!adapter.isEmpty()){
            ListView lv = getListView();

            View lvFooter = ((LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                    .inflate(R.layout.lv_footer, null, false);
            String total_text = "Итого: " + adapter.getXeResult() + " XE";
            ((TextView) lvFooter.findViewById(R.id.total_text)).setText(total_text);
            lv.setDivider(null);
            lv.addFooterView(lvFooter);
        }

    }

}

public class AddItemFragment extends Fragment{

    EditText carbCount;
    EditText foodCount;
    Button setResultButton;

    public AddItemFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_add_item, container, false);
        CalcActivity activity = (CalcActivity) getActivity();
        activity.navigationView.setCheckedItem(R.id.nav_xe_list);
        carbCount = (EditText) view.findViewById(R.id.carbCount);
        foodCount = (EditText) view.findViewById(R.id.foodCount);
        setResultButton = (Button) view.findViewById(R.id.xeAdd);
        setResultButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (ValidationEditText.validate(carbCount) && ValidationEditText.validate(foodCount)){
                    double carbCountUnit = Double.valueOf(carbCount.getText().toString());
                    double foodCountUnit = Double.valueOf(foodCount.getText().toString());
                    double result = ((carbCountUnit/12)/100) * foodCountUnit;
                    CalcActivity activity = (CalcActivity) getActivity();
                    ArrayList<XeData> list = activity.getXeData();
                    list.add(new XeData(carbCountUnit, result));
                    final InputMethodManager imm = (InputMethodManager) getActivity()
                            .getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
                    activity.setXeData(list);
                    XeListFragment xe_list = new XeListFragment();
                    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.container, xe_list);
                    fragmentTransaction.commit();
                }
            }
        });
        return view;
    }
}

При таком раскладе, после добавления элемента я возвращаюсь в список и там кнопка назад ведет на этот же список, и получается двойной вызов фрагмента, как быть?
  • Вопрос задан
  • 638 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Ошибка в обработчике setResultButton'a
XeListFragment xe_list = new XeListFragment();
                    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.container, xe_list);
                    fragmentTransaction.commit();

У вас предыдущая транзакция в бекстеке. Нужно вместо этого сделать fragmentManager.popBackStack(); - вытащить транзакцию из бекстека и тем самым вернуться на предыдущий экран.

Но вообще-то плохо, что фрагмент добавления знает о том, что есть другие фрагменты и манипулирует бекстеком. Лучше организовать это, например, через активити.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы