2017-10-17 85 views
-2

在我的應用程序調用片段的方法我想打電話從其他fragmentsfragment方法,我下面寫代碼,但如果調用此方法告訴我下面的錯誤在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)); 

注意:各位版主和親愛的用戶,我知道這個錯誤空指針,但我不知道我該如何解決它?
我試圖解決這個問題,但我不能所以我問StackOverFlow
請幫助我,不要給我負面的觀點或重複我的文章!

請幫助我,感謝所有

回答

0

這裏,

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

是新創建的片段類。在開始創建Fragment類時,您需要使用所有變量。

使用viewPager.setOffscreenPageLimit(fragmentNumber); - 這將幫助您在標籤初始化時創建所有片段。 然後使用實例來訪問任何片段方法。

申報的片段類的頂部,private static FragmentClass instance = null;

您的片段類重寫裏面的onCreate()和初始化實例,

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

創建的getInstance()的片段方法中包含您的調用方法,

public static FragmentClass getInstance(){ 

    return instance; 
} 

最後從另一個片段調用方法,

FragmentClass.getInstance().yourMethod(); 
+0

感謝我的兄弟,但沒有初始化實例!你能告訴我完整的代碼嗎?因爲我是業餘的。請 – Joke

+0

你能幫我的弟弟嗎? – Joke

+0

檢查更新的答案,讓我知道它的工作與否。 – Exigente05

0

不要拿它,否則,但你在做什麼不是好的設計模式, 你應該使用接口來進行任何兩個片段之間的通信。它會讓事情變得更容易。看看這個帖子Basic Communication between two fragments