2015-01-02 138 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