如何从其他片段调用片段方法?

时间:2017-10-17 05:17:14

标签: android android-fragments

在我的应用程序中,我希望从其他fragment调用fragments方法,我写下面的代码,但是当调用此方法时,我会在 logcat 和强制关闭应用程序中向我显示以下错误。

要显示这两个fragmentsactivity我使用TabLayoutViewPager

我的评论片段代码:

public void getComments(final Context context) {

    JsonObject requestBean = new JsonObject();
    requestBean.addProperty("entityType", 1);
    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) {
                    reviewMovieFrag_NoComment.setText("");
                } else {
                    reviewMovieFrag_NoComment.setText(context.getResources().getString(R.string.noReviews));
                    SerialReview_CastProgress.setVisibility(View.GONE);
                }
                commentModel.clear();
                commentModel.addAll(response.body().getData());
                commentsListAdapter.notifyDataSetChanged();
                reviewMovieFrag_newsCommentsRecyclerView.setAdapter(commentsListAdapter);

                reviewMovieFrag_newsCommentsUserTypeText.setText(userTypeStr);
                reviewMovieFrag_newsCommentsReviewTypeText.setText(reviewTypeStr);

                reviewMovieFrag_Progress.setVisibility(View.GONE);
            }
        }

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

我希望调用此方法( getComments 方法)进入 InfoFragment ,为此我写了这段代码:

new MovieDetail_reviewFragment().getComments(getActivity());

但在LogCat中显示此错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.test.app.Fragments.MovieDetailFragments.MovieDetail_reviewFragment$6.onResponse(MovieDetail_reviewFragment.java:301)
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)

显示此行的错误:

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

注意:尊敬的版主和亲爱的用户我知道 NullPointer 的此错误,但我不知道如何解决?
我试图解决这个问题,但我不能在 StackOverFlow 中询问。
请帮助我,不要给我负面评价或重复我的帖子!

请帮帮我,谢谢大家

2 个答案:

答案 0 :(得分:1)

下面,

new MovieDetail_reviewFragment().getComments(getActivity());

新创建片段类。在开始时创建Fragment类时,您需要使用所有变量。

使用viewPager.setOffscreenPageLimit(fragmentNumber); - 这有助于您在初始化标签时创建所有片段。 然后使用instance访问任何片段方法。

在片段类private static FragmentClass instance = null;

的顶部声明 Fragment类中的

覆盖onCreate()并初始化实例

 @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instance = this;
}

在fragment中创建getInstance()方法包含你的调用方法

public static FragmentClass getInstance(){

    return instance;
}

最后从另一个片段调用方法,

FragmentClass.getInstance().yourMethod();

答案 1 :(得分:0)

不要接受它,但你正在做的不是好的设计模式, 你应该使用接口在任何两个片段之间进行通信。它会让你的事情变得更轻松。请看这篇文章Basic Communication between two fragments