未在片段中获取 Activity 的上下文

Not Getting Activity's context in fragment

我正在开发一个包含购物车管理的电子商务应用程序。现在我有一个片段(CartFragment)和一个适配器(ShowCartAdapter)附加到 recyclerView。

我在单个片段中进行了三个网络调用(即 1. 将商品添加到购物车,2. 显示购物车中的商品,3. 删除购物车中的商品)。

以上片段附加到 activity(ProductDetailActivity)。将商品添加到购物车并在购物车中显示商品效果很好,但第三个,即从购物车中删除商品很麻烦 me.I我的 cardview 中的一个图标用于删除一个项目,单击该图标我想从 recyclerview 中删除该项目,现在我将项目的唯一 ID 从适配器发送到片段,但它给了我 null当我点击 icon.Might 时 ProgressDialog(progressDialog=new ProgressDialog(getActivity());) 上的指针是 activity 不再附加到该片段。下面是我的适配器、片段和 activity.Please 帮助我的代码片段 !!!

CartFragment

public class CartFragment extends Fragment implements RetrofitTaskListener<AddCart> {

    private ProgressDialog progressDialog;
    private RecyclerView recyclerView;
    private AdapterAddCart adapter;
    private AdapterShowCart adapterShowCart;
    private boolean loading = true;
    AddCart addCartList;
    int pageIndex;
    private LinearLayoutManager linearLayoutManager;
    private String  email1,articlCode,image,quantity,cost;
    private static final String STARTING_TEXT = "Four Buttons Bottom Navigation";
    private Button btnCheckout;
    private FragmentTransaction fragmentTransaction;
    private int frag,cartSize;
    private TextView cartEmptyTxt;
    private Context context;
    private SharedPreferences sharedPreference;
    private SharedPreferences.Editor editor;
    private SessionManager session;
    private EditText cmntTxt;


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

   public static CartFragment newInstance(int text) {
        Bundle args = new Bundle();
        args.putInt(STARTING_TEXT, text);

       CartFragment sampleFragment = new CartFragment();
        sampleFragment.setArguments(args);
        return sampleFragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        articlCode = getArguments().getString("artCode");
        image = getArguments().getString("image");
        quantity = getArguments().getString("quantity");
        cost = getArguments().getString("cost");
        frag = getArguments().getInt("fragment");

        View view =  inflater.inflate(R.layout.fragment_cart, container, false);
        cmntTxt = (EditText)view.findViewById(R.id.comment_txt);
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        session = new SessionManager(getActivity().getApplicationContext());

        sharedPreference = getActivity().getSharedPreferences("CART",0);
        editor = sharedPreference.edit();

        ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Cart");

        btnCheckout = (Button)view.findViewById(R.id.btnCheckout);

        cartEmptyTxt = (TextView)view.findViewById(R.id.emptytxt);
        cartEmptyTxt.setVisibility(View.GONE);

        if (!session.isLoggedIn()) {
            cartEmptyTxt.setVisibility(View.VISIBLE);
            btnCheckout.setVisibility(View.GONE);
            cmntTxt.setVisibility(View.GONE);

        }

        btnCheckout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
     FragmentManager fm = getFragmentManager();
                fragmentTransaction = fm.beginTransaction();
                AddressFragment addressFragment = new AddressFragment();
        fragmentTransaction.replace(R.id.fragmentContainer,addressFragment);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();    }
        });
        pageIndex = 0;
        recyclerView = (RecyclerView)view.findViewById(R.id.cart_recycler_view);
         linearLayoutManager=new LinearLayoutManager(getActivity());
   recyclerView.setLayoutManager(linearLayoutManager);
    SQLiteHandler sqLiteHandler = new SQLiteHandler(getActivity());
        List<SessionModel> sessionModelList = sqLiteHandler.getUserDetails();
        Bundle arguments = getArguments();
        if (arguments != null) {
            for (SessionModel sm : sessionModelList){
                email1 = sm.getEmail();
            }

            if (frag == 6){
            callCartService(email1,articlCode,cost,quantity);
            }else if (email1!=null){
                callGetCart(email1);
            }
     }

        return view;
    }
  public void callCartService(String email,String artCode,String price,String qty){
        showProgreass();
        pageIndex = pageIndex + 1;
        String url = String.format(ServerConfigStage.ADD_CART(),email,artCode,price,qty);
        RetrofitTask task = new RetrofitTask<>(CartFragment.this, CommonUtility.HTTP_REQUEST_TYPE.POST, CommonUtility.CallerFunction.ADD_CART_FUNCTION, url,getActivity());
        task.execute();
 }

    public void callGetCart(String email){
        showProgreass();
        pageIndex = pageIndex + 1;
        String url = String.format(ServerConfigStage.GET_CART(),email);
        RetrofitTask task = new RetrofitTask<>(CartFragment.this, CommonUtility.HTTP_REQUEST_TYPE.POST, CommonUtility.CallerFunction.GET_CART, url,getActivity());
        task.execute();
   }

    public void delItemCart(String email,String itemId){
        adapterShowCart = new AdapterShowCart(getContext(),CartFragment.this);
        showProgreass();
        String url = String.format(ServerConfigStage.DEL_ITEM_CART(),email,itemId);
        RetrofitTask task = new RetrofitTask<>(CartFragment.this, CommonUtility.HTTP_REQUEST_TYPE.POST, CommonUtility.CallerFunction.DEL_ITEM_CART, url,getActivity());
        task.execute();
    }
 public void showProgreass(){
        progressDialog=new ProgressDialog(getActivity());
        progressDialog.setIndeterminate(true);
        progressDialog.setMessage("Please Wait...");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setCancelable(false);
        progressDialog.show();
    }
    public void stopProgress(){
        if(progressDialog!=null && progressDialog.isShowing())
            progressDialog.cancel();
    }

    @Override
    public void onRetrofitTaskComplete(Response<AddCart> response, Context context, CommonUtility.CallerFunction _callerFunction) {
        stopProgress();
        if (response.isSuccess()) {
            if (response.body() != null) {
            addCartList    =response.body();

              if (_callerFunction == CommonUtility.CallerFunction.ADD_CART_FUNCTION){
                  if (addCartList.getStatus() == 0){
                      cartSize = addCartList.getDeatils().size();
                      editor.putInt("CART_ITEMS",cartSize);
                      editor.commit();
                      Toast.makeText(context, addCartList.getResponse(), Toast.LENGTH_SHORT).show();
                      if (adapter == null) {
                          adapter = new AdapterAddCart(context, R.layout.row_cart, addCartList);
                          recyclerView.setAdapter(adapter);
                      }
                  }else
                    if(addCartList.getStatus()>0) {
                        cartSize = addCartList.getDeatils().size();
                        editor.putInt("CART_ITEMS",cartSize);
                        editor.commit();
          if (adapter == null) {
                        adapter = new AdapterAddCart(context, R.layout.row_cart, addCartList);
                  recyclerView.setAdapter(adapter);

             }

                    adapter.notifyDataSetChanged();
                }else {cartSize = addCartList.getDeatils().size();
                        editor.putInt("CART_ITEMS",cartSize);
                        editor.commit();
                        if (adapter == null) {
                            adapter = new AdapterAddCart(context, R.layout.row_cart, addCartList);

                            recyclerView.setAdapter( adapter );;

                        }

                        adapter.notifyDataSetChanged();


                        Toast.makeText(context, addCartList.getResponse(), Toast.LENGTH_SHORT).show();

                    }
                }else if (_callerFunction == CommonUtility.CallerFunction.GET_CART){
                  if (addCartList.getStatus() == 0){
                      if (addCartList.getCart().size()>0){
                      cartSize = addCartList.getCart().size();
                      editor.putInt("CART_ITEMS",cartSize);
                      editor.commit();
                      }
                  }else
                    if(addCartList.getStatus()>0) {
                        if (addCartList.getCart().size()>0){
                        cartSize = addCartList.getCart().size();
                        editor.putInt("CART_ITEMS",cartSize);
                        editor.commit();}
                        if (adapterShowCart == null) {
                            adapterShowCart = new AdapterShowCart(context, R.layout.row_cart, addCartList);

                            recyclerView.setAdapter(adapterShowCart);
                            ;

                        }
                        adapterShowCart.notifyDataSetChanged();
                }else {
                        cartEmptyTxt.setVisibility(View.VISIBLE);
                    }

                        //Toast.makeText(context, addCartList.getResponse(), Toast.LENGTH_SHORT).show();
                }else if (_callerFunction == CommonUtility.CallerFunction.DEL_ITEM_CART){
                  if (addCartList.getStatus()>0){
                      if (adapterShowCart == null) {
                          adapterShowCart = new AdapterShowCart(context, R.layout.row_cart, addCartList);
                          recyclerView.setAdapter(adapterShowCart);

                      }adapterShowCart.notifyDataSetChanged();

                  }
              }
            }

        }

    }

    @Override
    public void onRetrofitTaskFailure(Throwable t) {
        stopProgress();
       // Toast.makeText(getActivity(),"Fail to load Data",Toast.LENGTH_LONG).show();

        if (getActivity()!= null)
        {
        getActivity().finish();
        }
    }

    public void myFragmentMethod(){
        // make sure to double check casts (to YourActivity) like these before invoking
        ((ProductDetailActivity)getActivity()).myOnResume();
    }


}

AdapterShowCart

public class AdapterShowCart extends RecyclerView.Adapter<AdapterShowCart.ViewHolder>{
    private AddCart addCartList;
    private RemoveItemCommunication removeItemCommunication;
    private CartFragment cartFragment = new CartFragment();


    Context context;
    private int layoutResourceId,cart;
    private SharedPreferences sharedPreferences;

    public AdapterShowCart(Context context, int layoutResourceId, AddCart addCarts) {
        this.context = context;
        this.layoutResourceId = layoutResourceId;
        this.addCartList = addCarts;
    }

    public AdapterShowCart(Context context, CartFragment cartFragment) {
        this.context = context;
        this.cartFragment=cartFragment;
    }

    public void setOnClickListener(RemoveItemCommunication removeItemCommunication1){
        removeItemCommunication = removeItemCommunication1;
    }

    @Override
    public AdapterShowCart.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_cart, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(AdapterShowCart.ViewHolder viewHolder, int i) {


        viewHolder.tv_android.setText("Price :"+" "+addCartList.getCart().get(i).getPrice());
        viewHolder.tv_art_number.setText("Article No. :"+" "+addCartList.getCart().get(i).getItemCode());
        viewHolder.tvQty.setText("Quantity :"+""+addCartList.getCart().get(i).getCartQuantity());


        //viewHolder.img_android.setImageResource(products.get(i).getAndroid_image_url());
        Picasso.with(context).load(addCartList.getCart().get(i).getURL()).resize(240, 120).into(viewHolder.img_android);
    }

    @Override
    public int getItemCount() {

       // cart = sharedPreferences.getInt("CART_ITEMS",0);


            return addCartList.getCart().size();

    }



    class ViewHolder extends RecyclerView.ViewHolder{
        private TextView tv_android,tv_art_number,tvQty;
        private ImageView img_android,remove;
        private int pos;
        private CardView cardView;
        public ViewHolder(View view) {
            super(view);

            tv_android = (TextView)view.findViewById(R.id.tvTitle);
            tv_art_number=(TextView)view.findViewById(R.id.tvNumber);
            cardView = (CardView)view.findViewById(R.id.card_view);
            img_android = (ImageView) view.findViewById(R.id.mealImage);
            tvQty=(TextView)view.findViewById(R.id.tvQty);
            remove=(ImageView)view.findViewById(R.id.removeItem);
            remove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int pos = getAdapterPosition();
                    cartFragment.delItemCart(addCartList.getEmail(),addCartList.getCart().get(pos).getId());
                }
            });

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    pos = getAdapterPosition();



                }
            });
        }
    }

}

ProductDetailActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product_detail);

        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setTitle("Product Details");
        supportInvalidateOptionsMenu();
        toolbar.setTitleTextColor(Color.WHITE);

        session = new SessionManager(getApplicationContext());


        itemCode = getIntent().getExtras().getString("ItemCode");
        itemName = getIntent().getExtras().getString("ItemName");

        stockAvailibility = (ImageView) findViewById(R.id.stock_image);
        code = (TextView) findViewById(R.id.item_code);
        price = (TextView) findViewById(R.id.price_txt);
        name = (TextView) findViewById(R.id.product_name);
        productImage = (ImageView) findViewById(R.id.image_big);
        stock = (TextView) findViewById(R.id.stock);
        stock_status = (TextView) findViewById(R.id.stock_text);
        quantity_txt = (EditText) findViewById(R.id.unit_number);
        qtyText = (TextView) findViewById(R.id.selectQty);


        addCart = (Button) findViewById(R.id.btn_add_cart);



        callProductDetail(itemCode);


        addCart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String selectedQty = quantity_txt.getText().toString();

                if (session.isLoggedIn()) {

                    if (!selectedQty.isEmpty() && Integer.parseInt(selectedQty) > Integer.parseInt(qty)) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(ProductDetailActivity.this);
                        builder.setMessage("You can not add more than" + " " + qty + " " + "units")
                                .setCancelable(false)
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        //do things
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    } else if (selectedQty.isEmpty() || Integer.parseInt(selectedQty) == 0) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(ProductDetailActivity.this);
                        builder.setMessage("Please Add Quantity")
                                .setCancelable(false)
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        //do things
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();

                    } else if (!selectedQty.isEmpty() && Integer.parseInt(selectedQty) != 0 && Integer.parseInt(selectedQty) <= Integer.parseInt(qty)) {
                    addCart.setVisibility(View.GONE);
                        hideKeyboard(ProductDetailActivity.this);
                    fm = getSupportFragmentManager();

                    fragmentTransaction = fm.beginTransaction();
                    CartFragment cartFragment = new CartFragment();
                    fragmentTransaction.replace(R.id.fragmentContainer,cartFragment);
                    Bundle bundle = new Bundle();
                    bundle.putString("artCode", artCode);
                    bundle.putString("image",image_url);
                    bundle.putString("quantity",selectedQty);
                        bundle.putString("cost",cost);
                    bundle.putInt("fragment",6);
                    cartFragment.setArguments(bundle);
                    fragmentTransaction.addToBackStack(null);
                    fragmentTransaction.commitAllowingStateLoss();
                }
                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(ProductDetailActivity.this);
                    builder.setMessage("Please Login To Continue")
                            .setCancelable(false)
                            .setNegativeButton("NOT NOW", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {

                                }
                            })
                            .setPositiveButton("LOGIN", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    Intent intent = new Intent(ProductDetailActivity.this, LoginActivity.class);
                                    intent.putExtra("fragment", 7);
                                    startActivity(intent);
                                }
                            });
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            }
        });



    }

    public void myOnResume(){
        this.onResume();
        addCart.setVisibility(View.VISIBLE);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case android.R.id.home:
                // todo: goto back activity from here

                finish();
                return true;


            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public void showProgreass() {
        progressDialog = new ProgressDialog(ProductDetailActivity.this);
        progressDialog.setIndeterminate(true);
        progressDialog.setMessage("Please Wait...");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    public void stopProgress() {
        if (progressDialog != null && progressDialog.isShowing())
            progressDialog.cancel();
    }

    public void callProductDetail(String productId) {
        showProgreass();

        String url = String.format(ServerConfigStage.GET_PRODUCT_DETAIL(), productId);
        RetrofitTask task = new RetrofitTask<List<ProductDetail>>(ProductDetailActivity.this, CommonUtility.HTTP_REQUEST_TYPE.GET, CommonUtility.CallerFunction.GET_PRODUCT_DETAIL, url, ProductDetailActivity.this);
        task.execute();


    }

    @Override
    public void onRetrofitTaskComplete(Response<List<ProductDetail>> response, Context context, CommonUtility.CallerFunction _callerFunction) {
        stopProgress();
        if (response.isSuccess()) {
            if (response.body() != null) {
                if (response.body().get(0).getStatus() > 0) {

                    String json = gson.toJson(response);
                    System.out.println(json);

                    artCode = response.body().get(0).getItemcode();
                    cost = response.body().get(0).getPrice();
                    String desc = response.body().get(0).getDescription();
                    image_url = response.body().get(0).getURL();
                    Double d = response.body().get(0).getStock();
                    Double aDouble = new Double(d);
                    int i = aDouble.intValue();
                    qty = String.valueOf(i);

                    if (qty.equals("0")) {
                        stock_status.setText("Not In Stock");
                        stockAvailibility.setImageResource(R.mipmap.stockunavailable);
                        quantity_txt.setVisibility(View.GONE);
                        qtyText.setVisibility(View.GONE);
                        addCart.setVisibility(View.GONE);


                    } else {
                        stockAvailibility.setImageResource(R.mipmap.stock_image);
                    }
                    code.setText(artCode);
                    price.setText("Euro" + "" + cost);
                    productDescription = (ExpandableTextView) findViewById(R.id.expand_text_view);
                    productDescription.setText(desc);
                    name.setText(itemName);
                    stock.setText("Units :" + " " + qty);
                    Picasso.with(context).load(image_url).resize(240, 120).into(productImage);
                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage(response.body().get(0).getResponse())
                            .setCancelable(false)
                            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    //do things
                                }
                            });
                    AlertDialog alert = builder.create();
                    alert.show();

                    //Toast.makeText(context, response.body().get(0).getResponse(), Toast.LENGTH_SHORT).show();

                }
            }

        }
    }

    @Override
    public void onRetrofitTaskFailure(Throwable t) {
        stopProgress();
        //Toast.makeText(ProductDetailActivity.this,"Fail to load Data",Toast.LENGTH_LONG).show();

        finish();
    }

    public static void hideKeyboard(Context ctx) {
        InputMethodManager inputManager = (InputMethodManager) ctx
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        // check if no view has focus:
        View v = ((Activity) ctx).getCurrentFocus();
        if (v == null)
            return;

        inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }


}

堆栈跟踪

Process: com.jbm.jbmcustomer, PID: 9188
                                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
                                                                       at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:222)
                                                                       at android.app.AlertDialog.<init>(AlertDialog.java:200)
                                                                       at android.app.AlertDialog.<init>(AlertDialog.java:196)
                                                                       at android.app.AlertDialog.<init>(AlertDialog.java:141)
                                                                       at android.app.ProgressDialog.<init>(ProgressDialog.java:77)
                                                                       at com.jbm.jbmcustomer.fragment.CartFragment.showProgreass(CartFragment.java:179)
                                                                       at com.jbm.jbmcustomer.fragment.CartFragment.delItemCart(CartFragment.java:172)
                                                                       at com.jbm.jbmcustomer.adapter.AdapterShowCart.onClick(AdapterShowCart.java:80)
                                                                       at android.view.View.performClick(View.java:5198)
                                                                       at android.view.View$PerformClick.run(View.java:21147)
                                                                       at android.os.Handler.handleCallback(Handler.java:739)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:148)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

getActivity 返回 null 的原因是,您使用的是在适配器 class 内初始化的购物车片段实例,该实例未附加到任何 activity。 因此,请将 CartFragment 的实例从 CartFragment 传递到适配器 class 以解决问题。 AdapterShowCart class 中有一个构造函数,其中传递了购物车片段实例,但在片段中的 delItemCart(String email,String itemId) 中调用了它(我不明白为什么要这样做)。

AdapterShowCart 第 80 行中,您正在触发一个操作,该操作尝试使用对不再存在的上下文的引用从资源中获取值。

据推测,ProductDetailActivity.this 导致了问题。