Получение сохраненного значения в onResume в android api 26

У меня проблема с сохранением и извлечением значений в одноэлементном классе только в android oreo. У меня есть активность с 4 фрагментами. 1-й фрагмент показывает список продуктов. Каждый раз, когда пользователь выбирает этот продукт, я сохраняю этот продукт в переменной класса singleton. Теперь, когда Я пытаюсь получить это значение во втором фрагменте, он показывает исключение нулевого указателя. Я сохраняю значение в onStop () и получаю значение в onResume (). Ниже приведен метод onStop для fragmentProduct, в котором я сохраняю порядок в orderList.

Фрагмент продукта

 public void onStop()
    {
        super.onStop();
        Log.d("stop","called");
        globalProvider.shangpingListDefault.clear();
        if (MiTems!=null) {
            for(int i=0;i<MiTems.size();i++){
                for(int a=0;a<MiTems.get(i).size();a++){
                    globalProvider.shangpingListDefault.add(MiTems.get(i).get(a));
                }
            }

        }

        List<OrderSubmit> orderList=new ArrayList<OrderSubmit>();
        this.shangPingList=globalProvider.shangpingList;
        List<Contract> contractList=globalProvider.contractListToCart;
        for (int i = 0; i < globalProvider.contractListToCart.size(); i++) {
            //globalProvider.orders.add(new OrderSubmit());
            OrderSubmit order = new OrderSubmit();
            order.products = new ArrayList<Product>();
            //Contract contract=globalProvider.contractListToCart.get(i);
            for (int a = 0; a < globalProvider.shangpingList.size(); a++) {
                Product product = globalProvider.shangpingList.get(a);
                if (globalProvider.contractListToCart.get(i)._supplier.equals(product.get_supplier())) {
                    order.products.add(product);
                }
            }
            orderList.add(order);
            Log.d("orderlist","orderadded");
        }

Ниже приведен метод OnResumeMethod FragmentCart, где я получаю порядок в onResume

FragmentCart

public void onResume()
    {
        super.onResume();

        orders=globalProvider.orders;
        Log.d("checksizeorder",globalProvider.orders.size()+"");

        setSelect();

    }

В MainActivity при выборе вкладки я заменяю этот фрагмент: Основная деятельность

public void setSelect(int i){
        FragmentManager fm=getFragmentManager();
        FragmentTransaction transaction=fm.beginTransaction();
        //hide(transaction);
        switch(i){
            case 0:
                if (globalProvider.singal==0){
                    return;
                }
                globalProvider.singal=0;
                FragmentContract fragment_contract = new FragmentContract();
                transaction.replace(R.id.main, fragment_contract);
                shangping_Img.setImageResource(R.drawable.shangping_pressed);
                cart_Img.setImageResource(R.drawable.cart);
                dingdan_Img.setImageResource(R.drawable.dingdan);
                wode_Img.setImageResource(R.drawable.my_info);
                one.setTextColor(0xffee2400);
                two.setTextColor(0xff666666);
                three.setTextColor(0xff666666);
                four.setTextColor(0xff666666);
                break;
            case 1:
                if (globalProvider.singal==1){
                    return;
                }
                globalProvider.singal=1;
                FragmentCart cart_fragment=new FragmentCart();
                transaction.replace(R.id.main, cart_fragment);
                shangping_Img.setImageResource(R.drawable.shangping);
                cart_Img.setImageResource(R.drawable.cart_pressed);
                dingdan_Img.setImageResource(R.drawable.dingdan);
                wode_Img.setImageResource(R.drawable.my_info);
                one.setTextColor(0xff666666);
                two.setTextColor(0xffee2400);
                three.setTextColor(0xff666666);
                four.setTextColor(0xff666666);
                break;

Это поможет, если вы разместите какой-нибудь код. Небольшое примечание: onStop для фрагмента не будет вызываться, если вы показываете другой фрагмент, если только вы его не уничтожаете. Вы можете подумать о сохранении значения, когда фрагмент станет невидимым.

MoGa 21.03.2018 03:05

@MoGa: Обновлено. Смотрите, мой метод onStop вызывается всякий раз, когда я перехожу к другому фрагменту, как я проверял с помощью регистратора.

user3792429 21.03.2018 03:20

onPause является аналогом onResume - другими словами, вы можете перейти к onResume без onStop.

Andy 21.03.2018 03:43

@Andy Я тоже пытался сохранить значение в onPause. Это не сработало

user3792429 21.03.2018 03:51

Я понял, что метод onResume нового фрагмента вызывается до onStop

user3792429 21.03.2018 04:18

Даже onPause вызывается перед onResume нового фрагмента. Пожалуйста, помогите!

user3792429 21.03.2018 04:31
1
6
139
1

Ответы 1

Есть некоторая проблема с фрагментом в версии oreo. Я создал отдельное приложение, чтобы проверить, какие функции жизненного цикла вызываются, когда мы заменяем один фрагмент другим ... Вот журнал:

MainActivity onCreate ->
FragmentA oncreate ->
FragmentA oncreateView ->
MainActivity onStart ->
FragmentA onStart ->
MainActivity onResume ->
FragmentA onResume ->
Button Pressed;that replace fragment A with Fragment B
FragmentB oncreate ->
FragmentB onCreateVew ->
FragmentB onStart ->
FragmentB onResume ->
FragmentA onPause ->
FragmentA onStop ->
FragmentA onDestroy ->

Я импортировал import android.app.Fragment. Он работал, когда я заменил его на android.support.v4.app.Fragment.

Другие вопросы по теме