2016-02-19 93 views
0

我試圖在每次更新用戶界面時爲我的textview設置文本。將文本設置爲textview在Android代碼中返回null

public class CourseDetailsFragment extends Fragment { 
    private static final String TAG = "CourseDetailsFragment"; 
    private OnFragmentInteractionListener listener; 
    private static CourseDetailsFragment instance; 
    protected @Bind(R.id.courseName)TextView courseName; 
    Course c; 
    View view; 


public static CourseDetailsFragment getInstance(){ 
    if (instance == null) { 
     instance = new CourseDetailsFragment(); 
    } 
    return instance; 
} 

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

@Override 
public void onActivityCreated(Bundle savedInstance) { 
    super.onActivityCreated(savedInstance); 
    ((AppCompatActivity)getActivity()).getSupportActionBar().setLogo(R.drawable.ic_overview); 
    ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Course Detail"); //redundant? 

} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    listener = null; 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     listener = (OnFragmentInteractionListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    view = inflater.inflate(R.layout.fragment_course_details, container, false); 
    ButterKnife.bind(this, view); 
    return view; 
} 
public void updateUI(Course cData) { 
    c = cData 
    courseName.setText(cData.getName()); 
} 

}

這其中,我想爲我的TextView設置的文本。但courseName仍然是null

public void updateUI(Course cData) { 
    c = cData 
    courseName.setText(cData.getName()); 
} 

這是updateUI被調用的地方。

public void onDataEntry(boolean saved, Fragment fragment, String identifier,  Object T) { 
    if (T instanceof Course){ 
     Course courseData = (Course)T; 
     Log.d(TAG, "onDataEntry: " + courseData.getName() + " " + courseData.getGrade()); 
     CourseDetailsFragment.getInstance().updateUI(courseData); 
    } 
} 

這是我的堆棧跟蹤:

02-19 17:31:56.317 4689-4689/hsleiden.nl.barometer E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: hsleiden.nl.barometer, PID: 4689 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 
                    at hsleiden.nl.barometer.views.fragment.CourseDetailsFragment.updateUI(CourseDetailsFragment.java:101) 
                    at hsleiden.nl.barometer.views.activity.BaseActivity.onDataEntry(BaseActivity.java:306) 
                    at hsleiden.nl.barometer.adapter.CourseAdapter$1.onClick(CourseAdapter.java:57) 
                    at android.view.View.performClick(View.java:5198) 
                    at android.view.View$PerformClick.run(View.java:21147) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:148) 
                    at android.app.ActivityThread.main(ActivityThread.java:5417) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

hola David,por favor postea el logcat –

+0

你能否提供異常堆棧跟蹤? –

+1

Java程序員最重要的技能之一就是定位錯誤並修復它們。最重要的幫助你的工具是調用堆棧跟蹤。它爲您提供發生錯誤的文件名和行號。 –

回答

1

的問題是這一行:

CourseDetailsFragment.getInstance().updateUI(courseData); 

的事情是,你@butterknife.Bind註釋TextView將保持爲空,直到調用ButterKnife.bind(this, view)。要進行該調用,您需要一個有效的視圖層次結構的父級,您可以在調用onCreateView生命週期方法時獲得該父級,因此TextView爲空,直到onCreateView。現在,在onCreate之後調用onCreateView,後者在onAttach之後被調用,其通過將片段附加到Activity來觸發,通常通過使用FragmentManager來觸發。調用CourseDetailsFragment.getInstance().updateUI(courseData)不會自動觸發片段生命週期,它只是實例化Fragment實例,如直到Fragment附加到ActivityonCreateView叫,你courseName爲空引用,這意味着調用updateUi方法創建後立即Fragment註定會導致空指針異常。

唯一的選擇,這行代碼就沒有拋出的異常的工作,如果這Fragment先前已被實例化,連接到一個活動,它已通過onCreateView方法了。

由於上述原因,我不建議將碎片作爲單例實現,特別是如果您想直接調用其他組件的引用。由於生命週期的緣故,活動和片段是實踐中的狀態機,並且您的方法不考慮該狀態,這是問題的根源。

對於速戰速決,你可以在你Activity覆蓋onFragmentsResumed方法 - 如果片段先前連接,你的推薦人應該是在這一點上有效。

相關問題