2016-11-13 52 views
0

這是我第一次使用Fragments,我不太明白如何管理它們。在這種情況下,我有兩個片段,我使用id fragment_place在FrameLayout中進行了顯示。這個問題可能與fragmentTransaction(addtobackstack/popbackstack)有關。Android-NullPointerException在回調後的片段

在Fragment2我展示一個彈出菜單時,我按下了手機的菜單按鈕,它按預期工作的第一次,但我去了之後回到以前的片段,並返回到fragment2現在如果我按我得到了菜單按鈕的下面錯誤

java.lang.NullPointerException 
at android.support.v7.view.menu.MenuBuilder.<init>(MenuBuilder.java:216) 
at android.support.v7.widget.PopupMenu.<init>(PopupMenu.java:103) 
at android.support.v7.widget.PopupMenu.<init>(PopupMenu.java:78) 
at android.support.v7.widget.PopupMenu.<init>(PopupMenu.java:63) 
at package.Fragment2.showPopup(Fragment2.java:93) 

下面是mainactivity和fragment2的代碼,這讓我瘋狂,任何幫助將不勝感激。

public class MainActivity extends AppCompatActivity implements Fragment1.onEvent { 

Fragment1 frag; 
Fragment2 frag2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    frag = new Frag1(); 
    // Begin the transaction 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragment_place, frag); 
    ft.commit(); 
} 

@Override 
public void onEventSelected(String key) { 
    frag2 = new Frag2(); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragment_place,frag2); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

@Override 
public void onBackPressed(){ 
    FragmentManager ft = getSupportFragmentManager(); 
    if (ft.getBackStackEntryCount() > 0) { 
     ft.popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    int action = event.getAction(); 
    int keyCode = event.getKeyCode(); 
    switch (keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      if (action == KeyEvent.ACTION_UP) { 
       Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_place); 
       if (f instanceof Fragment2) { 
        sendBroadcast(); 
       } 
      } 
      return true; 
     default: 
      return super.dispatchKeyEvent(event); 
    } 
} 

private void sendBroadcast(){ 
    Intent intent = new Intent("popup_menu"); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
}} 

這是有問題的片段。誤差線基本方法showPopup

public class Fragment2 extends Fragment { 
private String key; 
private View view; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.fragment, parent, false); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver, 
      new IntentFilter("popup_menu")); 

    return view; 
} 

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     showPopup(view); 
    } 
}; 


public void showPopup(View v) { 
    Button b = (Button) view.findViewById(R.id.b_attach); 
    PopupMenu popup = new PopupMenu(getActivity(), b); 

    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       //dosomething 
      } 
    }); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.menu_popup, popup.getMenu()); 
    popup.show(); 
}} 

回答

0

我解決了這個問題,擺脫sendbroadcast()和廣播接收器(),而不是現在我需要時直接從mainActivity調用showPopup()。

0

這是我做的方式和它的作品對我來說:

FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.content_frame,new fragment()).commit();