2017-01-08 57 views
0

我想将按钮添加到片段以调用另一个片段。我通过下面的代码添加。Android片段导致NPE“尝试调用虚拟方法”错误

package com.munz.lop; 


import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class HomeFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_home, container, false); 
    } 

    public HomeFragment() { 


     FragmentManager manager = getFragmentManager(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     HomeFragment homeFragment = new HomeFragment(); 


     transaction.add (R.id.relativelayout_for_fragment, homeFragment ); 
     transaction.commit(); 
     // Required empty public constructor 
    } 

    public void onSelectFragment(View view){ 

     Fragment newFragment; 

     if(view == view.findViewById (R.id.btnAbout)){ 
      newFragment = new AboutFragment(); 

     } else if(view == view.findViewById (R.id.btnFeedback)){ 
      newFragment = new FeedbackFragment(); 


     } else if (view == view.findViewById (R.id.btnContacts)){ 
      newFragment = new ContactUsFragment(); 



    } else { 
      newFragment = new HomeFragment(); 

     } 

     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
     transaction.replace (R.id.relativelayout_for_fragment, newFragment); 
     transaction.addToBackStack (null); 
     transaction.commit(); 
    } 





} 

它有没有错误,但我打开滑盖菜单它强制该菜单停止与下面的logcat的应用程序:

D/ViewRootImpl: ViewPostImeInputStage processPointer 0 
    D/ViewRootImpl: ViewPostImeInputStage processPointer 1 
    D/ViewRootImpl: ViewPostImeInputStage processPointer 0 
    D/ViewRootImpl: ViewPostImeInputStage processPointer 1 
    D/ViewRootImpl: ViewPostImeInputStage processPointer 0 
    D/ViewRootImpl: ViewPostImeInputStage processPointer 1 
    D/AndroidRuntime: Shutting down VM 
    E/AndroidRuntime: FATAL EXCEPTION: main 
         Process: com.munz.lop, PID: 27402 
         java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference 
          at com.munz.lop.HomeFragment.<init>(HomeFragment.java:32) 
          at com.munz.lop.SliderActivity.onNavigationItemSelected(SliderActivity.java:100) 
          at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:150) 
          at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811) 
          at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
          at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958) 
          at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:308) 
          at android.view.View.performClick(View.java:5716) 
          at android.view.View$PerformClick.run(View.java:22596) 
          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:7325) 
          at java.lang.reflect.Method.invoke(Native Method) 
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    Application terminated. 
+0

请在“Fragment”上找到一个很好的教程。要帮助你并不容易,因为你犯了很多错误的事情。 – peter

+0

规范[NPE问题]的可能重复(https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it/218510)?我还没有投票结束,因为我没有为Android开发,但它看起来像一个dup。 – halfer

+0

@Impmpence:logcats只能以代码格式显示。它们不需要另外放置在报价块中。 – halfer

回答

1

你片段的无参数的构造应该是空的;摆脱那里的一切。您应该创建片段,然后在片段的构造函数中,使用FragmentTransaction处理菜单项的单击,而不是

void onNavigationItemSelected() { 
    HomeFragment fragment = new HomeFragment(); 
    getFragmentManager().beginTransaction() 
      .add(R.id.relativelayout_for_fragment, fragment) 
      .commit(); 
} 
+0

错误:(98,1)错误:class,interface或enum – Dad

+1

@Dad这不是完整的代码。你需要做一点工作来正确地将它集成到你的代码中,尽管我已经给了你尽可能多的方向。发布一个编译器错误,我没有一个类的行号是非常有效的,并没有给我更多的帮助。 – Karakuri

+0

@爸爸:我们确实希望从你身边付出一些努力。紧急的乞讨和大声喊叫已经为你赢得了赞赏 - 别指望人们为你做所有的调试。考虑这里的答案是有帮助的线索,你的角色是将它们应用到你的项目中。 – halfer

相关问题