简体   繁体   中英

How to call one Fragment Method from another Fragment in android

In my application I want 2 fragments in a Activity . and for showing these 2 fragments I use ViewPager .

In Fragment two I have one method, and I want call this method from Fragment one !

My method in Fragment two :

public void getComments() {

    JsonObject requestBean = new JsonObject();
    requestBean.addProperty("entityType", 4);
    requestBean.addProperty("reviewType", 5);
    requestBean.addProperty("reviewUserType", 2);
    requestBean.addProperty("entityID", serialID);
    requestBean.addProperty("celebrityId", 0);
    requestBean.addProperty("pageIndex", 1);
    requestBean.addProperty("pageSize", 10);

    InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class);
    Call<CommentResponse> call = api.getComments(token, requestBean);

    call.enqueue(new Callback<CommentResponse>() {
        @Override
        public void onResponse(Call<CommentResponse> call, Response<CommentResponse> response) {
            if (response.body().getData() != null) {
                if (response.body().getData().size() > 0) {
                    reviewSerialFrag_NoComment.setText("");
                } else {
                    reviewSerialFrag_NoComment.setText(context.getResources().getString(R.string.noReviews));
                }
                commentModel.clear();
                commentModel.addAll(response.body().getData());
                commentsListAdapter.notifyDataSetChanged();
                reviewSerialFrag_newsCommentsRecyclerView.setAdapter(commentsListAdapter);

                reviewSerialFrag_newsCommentsUserTypeText.setText(userTypeStr);
                reviewSerialFrag_newsCommentsReviewTypeText.setText(reviewTypeStr);

                reviewSerialFrag_Progress.setVisibility(View.GONE);
            }
        }

        @Override
        public void onFailure(Call<CommentResponse> call, Throwable t) {
            reviewSerialFrag_Progress.setVisibility(View.GONE);
        }
    });
}

And call this method with below codes from Fragment one :

InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class);
Call<SendCommentResponse> call = api.getSendComment(token, sendData);

showView(loadProgress);
goneView(sendBtn);

call.enqueue(new Callback<SendCommentResponse>() {
    @Override
    public void onResponse(Call<SendCommentResponse> call, Response<SendCommentResponse> response) {
        if (response.body().getData()) {

            Alerter.create(getActivity())
                    .setText(context.getResources().getString(R.string.successSendComment))
                    .setDuration(2000)
                    .setIcon(R.drawable.ic_tick_new)
                    .setBackgroundColorRes(R.color.colorPrimary)
                    .enableSwipeToDismiss()
                    .enableProgress(true)
                    .setOnShowListener(new OnShowAlertListener() {
                        @Override
                        public void onShow() {
                            watchlistDialog.dismiss();
                            goneView(loadProgress);
                            showView(sendBtn);
                        }
                    })
                    .setOnHideListener(new OnHideAlertListener() {
                        @Override
                        public void onHide() {
                            infoEpisodeFrag_addWatchList.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_eye_white));
                            infoEpisodeFrag_addWatchList.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#1da8b9")));

                            getData();
                            new EpisodeDetail_ReviewFrag().getComments();
                        }
                    })
                    .setProgressColorRes(R.color.whiteMe)
                    .show();
        }
    }

    @Override
    public void onFailure(Call<SendCommentResponse> call, Throwable t) {

    }
});

But show me this error in LogCat :

FATAL EXCEPTION: main
                                                                         Process: com.example.app, PID: 11978
                                                                         java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.support.v4.app.FragmentActivity.getResources()' on a null object reference
                                                                             at com.example.app.Fragments.EpisodeDetailFrags.EpisodeDetail_ReviewFrag$6.onResponse(EpisodeDetail_ReviewFrag.java:305)
                                                                             at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
                                                                             at android.os.Handler.handleCallback(Handler.java:739)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:135)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5349)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at java.lang.reflect.Method.invoke(Method.java:372)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

Show me error for this line in Fragment two :

reviewSerialFrag_NoComment.setText(context.getResources().getString(R.string.noReviews));

How can I fix it? Please help me

No need to call getResources() method. Just getString(R.string.noReviews) works.

Get the instance of fragment

ExampleFrag frag=(ExampleFrag)getActivity().getSupportFragmentManager().findFragmentById(R.id.fragment2); 

Then call any method

 frag.myMethod();  

It is really a bad idea to use Fragments like regular classes. Even when you want to pass simple data around you'd use and instance or use the bundle.

If your method does not rely on the fragment itself, create a separate utility class that both fragments share. Just pass it a context so it can resolve some of the variables in it.

Separate the UI manipulation in a separate class within your fragments. Create a listener to this utility class and change the visual state in your fragment.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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