如何从android中的另一个Fragment调用一个Fragment方法

时间:2017-10-02 14:55:39

标签: java android android-fragments

在我的应用中,我希望fragments中的 2 Activity 。为了显示这两个fragments,我使用ViewPager

Fragment两个中我有一种方法,我想从 Fragment一个调用此方法!

我在Fragment 2中的方法:

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

并使用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) {

    }
});

但在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)

Fragment两个

中显示此行的错误
reviewSerialFrag_NoComment.setText(context.getResources().getString(R.string.noReviews));

我该如何解决?请帮帮我

3 个答案:

答案 0 :(得分:0)

无需调用getString(R.string.noReviews)方法。只需comma即可。

答案 1 :(得分:0)

获取片段

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

然后调用任何方法

 frag.myMethod();  

答案 2 :(得分:0)

使用像常规类这样的碎片真是个坏主意。即使你想传递简单数据,你也可以使用和实例或使用捆绑包。

如果您的方法不依赖于片段本身,请创建一个单独的实用程序类,两个片段共享。只需传递一个上下文,就可以解析其中的一些变量。

在片段中的单独类中分隔UI操作。创建此实用程序类的侦听器并更改片段中的可视状态。