【问题标题】:Retrieving saved value in onResume in android api 26在android api 26的onResume中检索保存的值
【发布时间】:2018-03-22 13:21:34
【问题描述】:

我在仅在 android oreo 中保存和检索单例类中的值时遇到问题。我有一个包含 4 个片段的活动。第一个片段显示产品列表。每当用户选择该产品时,我都会将该产品保存在单例类变量中.现在,当我尝试在第二个片段中检索此值时。它显示空指针异常。 我在 onStop() 中存储值并在 onResume() 中检索值。 下面是我在 orderList 中存储订单的 fragmentProduct 的 onStop 方法

片段产品

 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");
        }

下面是我在 onResume 中检索订单的 FragmentCart 的 OnResumeMethod

片段购物车

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

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

        setSelect();

    }

In MainActivity,whenever tab is selected I am replacing these fragment: 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 :已更新。请看,每当我移动到另一个片段时,都会调用我的 onStop 方法,因为我检查了记录器。
  • onPause 是 onResume 的倒数 - 换句话说,您可以在没有 onStop 的情况下进入 onResume。
  • @Andy 我也尝试过在 onPause 中保存价值。它没有用
  • 我意识到的是,新片段的onResume方法在onStop之前被调用

标签: android singleton android-8.0-oreo


【解决方案1】:

oreo 版本中的 Fragment 存在一些问题。我创建了一个单独的应用程序来检查当我们将一个 Fragment 替换为另一个 Fragment 时调用了哪些生命周期函数。这是日志:

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 替换它时它工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多