片段和活动之间的接口不起作用

时间:2017-01-13 16:41:35

标签: android android-fragments interface nullpointerexception

我想将我的String json从片段传递到另一个活动,所以在片段和活动之间建立接口但是当午餐应用程序从我的片段中的这一行获取null异常时:adapterCalljson.MethodCallbackjson(jsonStr);

这是我到目前为止的尝试:

接口类:

public interface AdapterCalljson {
    void MethodCallbackjson(String jsonn);
}

片段:

 public class maghalat extends Fragment {

    private View myFragmentView;
    private RecyclerView recyclerView;
    private DataAdapter adapter;
    private String TAG = MainActivity.class.getSimpleName();
    public ProgressDialog pDialog;
    List<jsonContent> listcontent=new ArrayList<>();

    public int dog=1;
    public String url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts";

    public int id;

   AdapterCalljson adapterCalljson;

    public String json;
    public String jsonStr;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof AdapterCalljson) {
            adapterCalljson = (AdapterCalljson) context;
        } else {
            throw new RuntimeException(context + " must implement AdapterCalljson");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        adapterCalljson = null;
    }
    public interface AdapterCalljson {

        void MethodCallbackjson(String json);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myFragmentView = inflater.inflate(R.layout.maghalat, container, false);


        adapterCalljson.MethodCallbackjson(json);
        asyncRun();


        return myFragmentView;
    }
        public void asyncRun(){
        if(isNetworkConnected()) {
            new GetContacts().execute();
        } else
        {
            Toast.makeText(getActivity().getApplicationContext(), "دستگاه شما به اینترنت متصل نیست!", Toast.LENGTH_LONG).show();
        }
    }


    public class GetContacts extends AsyncTask<Void, Void, Void> {


    @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            HttpHandler sh = new HttpHandler();

            // Making a request to url and getting response
          jsonStr = sh.makeServiceCall(url);


            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {

                    JSONObject jsonObj = new JSONObject(jsonStr);




                     id=jsonObj.getInt("pages");

                    JSONArray posts = jsonObj.getJSONArray("posts");

                    for (int i = 0; i < posts.length(); i++) {
                        JSONObject c = posts.getJSONObject(i);

                        jsonContent jsonContent=new jsonContent();

                        jsonContent.title=c.getString("title");

                        jsonContent.content=c.getString("content");

                        //img
                        JSONObject post_img=c.getJSONObject("thumbnail_images");
                        for (int j=0;j<post_img.length();j++)
                        {
                            JSONObject v=post_img.getJSONObject("mom-portfolio-two");
                            jsonContent.imgurl=v.getString("url");
                        }
                        jsonContent.pages=id;
                        jsonContent.curpage=dog;
                        listcontent.add(jsonContent);

                    }

                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getActivity().getApplicationContext(),
                                    "Json parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getActivity().getApplicationContext(),
                                "Couldn't get json from server. Check LogCat for possible errors!",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            pDialog.dismiss();
            recyclerView=(RecyclerView)myFragmentView.findViewById(R.id.recycler_view);
            recyclerView.setHasFixedSize(true);
            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
            recyclerView.setLayoutManager(layoutManager);

            adapter=new DataAdapter(getActivity(), listcontent, new AdapterCallback() {
                @Override
                public void MethodCallbackgo(String data) {

                    Integer s=null;
                    try {
                        s= Integer.valueOf(data);
                    }catch (NumberFormatException e)
                    {
                    }
                    if (s!=null && s>=1 && s<=id)
                    {
                        dog= Integer.parseInt(data);
                        url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts";
                        new GetContacts().execute();
                    }else
                    {
                        Toast.makeText(getActivity().getApplicationContext(),"صفحه پیدا نشد",Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void MethodCallbacknext() {

                    if (dog<id)
                    {
                        dog += 1;
                        url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts";
                        new GetContacts().execute();

                    }else {
                        Toast.makeText(getActivity().getApplicationContext(),"این آخرین صفحه است",Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void MethodCallbackprev() {
                    if (dog!=1)
                    {
                        dog-=1;
                        url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts";
                        new GetContacts().execute();
                    }else{
                        Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show();
                    }
                }
            });
            recyclerView.setAdapter(adapter);

            json=jsonStr;


        }
    }

2 个答案:

答案 0 :(得分:0)

您还没有为adapterCalljson分配对象。假设您在主机活动中实施AdapterCalljson,请从上下文onAttach分配:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof AdapterCalljson) {
        adapterCalljson = (AdapterCalljson) context;
    } else {
        throw new RuntimeException(context + " must implement AdapterCalljson");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    adapterCalljson = null;
}

public interface AdapterCalljson {

    void MethodCallbackjson(String json);

}

答案 1 :(得分:0)

首先,包含Fragment的Activity必须实现该接口。

public class MainActivity implements AdapterCalljson {

    @Override  
    void MethodCallbackjson(String jsonn) {
        doSomethingWithJson(jsonn);
    }    

    private void doSomethingWithJson(String json) {

    }

    // onCreate...

}

接下来,我建议您在AsyncTask之外创建RecyclerView。您不需要保存myFragmentView变量。

此外,您还无法调用回调。没有数据。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.maghalat, container, false);

    // recyclerView = rootView.findViewById
    // adapter = ...
    // recyclerView.setAdadpter...

    asyncRun(); // This happens in the background. There is no JSON yet

    return rootView;
}

然后,也许您应该doInBackground返回JSON字符串,这样您就不必将其存储为类变量。

最后一个参数是返回类型。

public class GetContacts extends AsyncTask<Void, Void, String>

那么,它是public String doInBackground(Void params...) {}public void onPostExecute(String result) {}

换句话说,不要return null

doInBackground
@Override
protected String doInBackground(Void... arg0) {

    HttpHandler sh = new HttpHandler();

    // Making a request to url and getting response
    jsonStr = sh.makeServiceCall(url);

    // Parse JSON more...

    return jsonStr;
}

然后你应该能够使用你的回调。

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    pDialog.dismiss();
    if (adapterCalljson != null) {
        adapterCalljson.MethodCallbackjson(result);
    } else {
        Log.w("Callback Error", "callback not assigned");
    }

    // adapter.notifyDataSetChanged(); // Might want this 
}
相关问题