繁体   English   中英

无法在片段外调用函数凌空?

[英]cannot call function volley outside fragment?

我尝试从外部片段调用函数,但是当我按下按钮显示错误并且应用停止时我显示错误,希望我以前尝试替换上下文传递而不是这个,而且我尝试使用getactivity()所有这些尝试均无效您可以帮助我,并提供解决问题所需的代码,谢谢:

//Loce cat :
 FATAL EXCEPTION: main
  Process: com.example.android.wacher, PID: 2997
  java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getCacheDir()' on a null object reference
      at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:89)
      at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:67)
      at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:102)
      at com.example.android.wacher.fragments.Page_6Fragment.sendNotfic(Page_6Fragment.java:232)
      at com.example.android.wacher.adapters.CustomerAdapter$1.onClick(CustomerAdapter.java:68)
      at android.view.View.performClick(View.java:5609)
      at android.view.View$PerformClick.run(View.java:22259)
      at android.os.Handler.handleCallback(Handler.java:751)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:154)
      at android.app.ActivityThread.main(ActivityThread.java:6077)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)



// Volly function inside fragment 
  public void sendNotfic() {
        RequestQueue queue = Volley.newRequestQueue(this.getActivity());
        String url = "http://192.168.1.2/Pagination/sendNotifaction.php";
        // Instantiate the RequestQueue.
        // RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        //this is the url where you want to send the request
        //TODO: replace with your own url to send request, as I am using my own localhost for this tutorial
        // Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                new com.android.volley.Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        // Display the response string.
                        Log.i("Response", "yes_"+response);
                    }
                }, new com.android.volley.Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("Response", "no"+error);
            }
        }) {
            //adding parameters to the request
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("token", "token");
                params.put("tok", "tokenasd");
                return params;
            }
        };
        // Add the request to the RequestQueue.
        queue.add(stringRequest);

    }


// funtion button to call volly fuction :
public class CustomerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public final int TYPE_MOVIE = 0;
    public final int TYPE_LOAD = 1;

    static Context context;
    List<Customer>customers;
    OnLoadMoreListener loadMoreListener;
    boolean isLoading = false, isMoreDataAvailable = true;

    public CustomerAdapter(Context context, List<Customer> customers) {
        this.context = context;
        this.customers = customers;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(context);
        if(viewType==TYPE_MOVIE){
            return new CustomerHolder(inflater.inflate(R.layout.row_movie,parent,false));
        }else{
            return new LoadHolder(inflater.inflate(R.layout.row_load,parent,false));
        }
    }


    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

        if(position>=getItemCount()-1 && isMoreDataAvailable && !isLoading && loadMoreListener!=null){
            isLoading = true;
            loadMoreListener.onLoadMore();
        }


        if(getItemViewType(position)==TYPE_MOVIE){
            ((CustomerHolder)holder).bindData(customers.get(position));
            if(((CustomerHolder)holder).buttonViewOption != null)((CustomerHolder)holder).buttonViewOption.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    // function call a volly function 
                  Page_6Fragment.newInstance().sendNotfic();

                }
            });
        }
    }



    @Override
    public int getItemViewType(int position) {
        if(customers.get(position).type.equals("movie")){
            return TYPE_MOVIE;
        }else{
            return TYPE_LOAD;
        }
    }



    @Override
    public int getItemCount(){

        return customers.size();
    }

    /* VIEW HOLDERS */

    static class CustomerHolder extends RecyclerView.ViewHolder{
        TextView tvTitle;
        TextView tvRating;
        Button buttonViewOption;

        public CustomerHolder(View itemView){
            super(itemView);
            tvTitle=(TextView)itemView.findViewById(R.id.title);
            tvRating=(TextView)itemView.findViewById(R.id.rating);
            buttonViewOption = (Button) itemView.findViewById(R.id.textViewOptions);
        }


        void bindData(Customer cust){
           tvTitle.setText(cust.name);
           tvRating.setText(cust.title);
        }
    }


    static class LoadHolder extends RecyclerView.ViewHolder{

        public LoadHolder(View itemView){
            super(itemView);
        }
    }

    public void setMoreDataAvailable(boolean moreDataAvailable) {
        isMoreDataAvailable = moreDataAvailable;
    }

    /* notifyDataSetChanged is final method so we can't override it
         call adapter.notifyDataChanged(); after update the list
    */

    public void notifyDataChanged(){
        notifyDataSetChanged();
        isLoading = false;
    }
    public interface OnLoadMoreListener{
        void onLoadMore();
    }


    public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
        this.loadMoreListener = loadMoreListener;
    }
}

您的错误意味着getCacheDir()函数使用的变量为null。 您的情况是上下文

您可以这样获得应用程序上下文:

public void onCreate() {
    super.onCreate();
    mContext = getApplicationContext();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM