2017-01-08 54 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

相關問題