【问题标题】:How to call fragment method from other fragments? [duplicate]如何从其他片段中调用片段方法? [复制]
【发布时间】:2018-12-05 21:43:51
【问题描述】:

在我的应用程序中,我想从其他 fragments 调用 fragment 方法,我编写了以下代码,但是当调用此方法时,在 logcat 中显示以下错误并强制关闭应用程序。

为了将这两个fragments 显示为activity,我使用TabLayout 和ViewPager。

我的评论片段代码:

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 中询问。
请帮助我,不要给我负分或复制我的帖子!

请帮帮我,谢谢大家

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    这里,

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

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

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

    在片段类的顶部声明,private static FragmentClass instance = null;

    在您的 Fragment 类中覆盖 onCreate() 并初始化实例,

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

    在片段中创建 getInstance() 方法包含您的调用方法,

    public static FragmentClass getInstance(){
    
        return instance;
    }
    

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

    FragmentClass.getInstance().yourMethod();
    

    【讨论】:

    • 感谢我的兄弟,但不初始化实例!你能告诉我完整的代码吗?因为我是业余爱好者。请
    • 你能帮帮我的兄弟吗?
    • 检查更新的答案,让我知道它是否有效。
    • 谢谢我的兄弟,你的代码很好用。但为什么对你不利?!
    • 没关系,帮到你就好了。顺便说一句,如果你愿意,你也可以投票给我的答案。 :)
    【解决方案2】:

    别想了,但你做的不是好的设计模式, 您应该使用接口在任何两个片段之间进行通信。它会让你的事情变得更容易。看看这个帖子Basic Communication between two fragments

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多