2015-01-02 136 views
4

嘗試從第一片段推出片段我得到這個錯誤:NullPointerException異常:FragmentManager.beginTransaction()

java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.FragmentTransaction android.app.FragmentManager.beginTransaction()' on a null object reference 

這裏就是我得到了錯誤的方法:

@Override 
    public void onClick(View v) { 
     Fragment fragment = new PropertyFragment(); 
     if (fragment != null) { 
      FragmentManager fragmentManager = fragment.getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

      // Replace whatever is in the fragment_container view with this fragment, 
      // and add the transaction to the back stack so the user can navigate back 
      fragmentTransaction.replace(R.id.rent_viewer, fragment); 
      fragmentTransaction.addToBackStack(null); 

      // Commit the transaction 
      fragmentTransaction.commit(); 
     } 
    } 

準確地說,下面的代碼指令會導致錯誤:

fragmentManager.beginTransaction(); 

這裏是如何的類和嵌套類的樣子:

public class RentFragment extends Fragment {  

    ... 

    @SuppressWarnings("unused") 
    private OnRentFragmentInteractionListener mListener; 

    public RentFragment() { 
    } 

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

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_rent, container, false);     

     myOnClickListener = new RentOnClickListener(getActivity());      

     return rootView; 
    } 

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

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

    public interface OnRentFragmentInteractionListener { 
     public void onRentFragmentInteraction(Uri uri); 
    } 

    private static class RentOnClickListener implements View.OnClickListener { 

     private final Context context; 

     private RentOnClickListener(Context context) { 
      this.context = context; 
     } 

     @Override 
     public void onClick(View v) { 
      Fragment fragment = new PropertyFragment();  
      if (fragment != null) {  
       FragmentManager fragmentManager = fragment.getFragmentManager(); 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

       // Replace whatever is in the fragment_container view with this fragment, 
       // and add the transaction to the back stack so the user can navigate back 
       fragmentTransaction.replace(R.id.rent_viewer, fragment); 
       fragmentTransaction.addToBackStack(null); 

       // Commit the transaction 
       fragmentTransaction.commit(); 
      } 
     }   
    }  
} 
+0

嘗試getSupportFragmentManager() –

+0

@RajenRaiyarela:我試過,但它說: 「該方法getSupportFragmentManager()是未定義的類型片段」。可能是因爲我的課程擴展了片段。不擴展活動。 – hyunikel

+0

你可以發表你的完整活動代碼 –

回答

6

FragmentManager直到它被連接到activity.So使用下面的代碼, 如果是分片嵌套使用this.getChildFragmentManager()您的片段類其他使用將是無效getActivity().getFragmentManager()getActivity().getSupportFragmentManager()

+0

onClick方法在嵌套靜態偵聽器類中。我不能使用這必須參考片段類。我怎樣才能訪問它? – hyunikel

+0

謝謝@Krish,我所要做的就是從嵌套的偵聽器類中移除靜態詞,並在容器類中使用get實例方法。所以我的指令變成:FragmentManager fragmentManager = getRentFragment()。getActivity()。getFragmentManager(); – hyunikel

-2
 FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     // Replace whatever is in the fragment_container view with this fragment, 
     // and add the transaction to the back stack so the user can navigate back 
     fragmentTransaction.replace(R.id.rent_viewer, fragment); 
     fragmentTransaction.addToBackStack(null); 

     // Commit the transaction 
     fragmentTransaction.commit(); 
+0

閱讀這個問題,你答案的第二行就是崩潰。 – BlueLeaf