Android -回调后Fragment中的NullPointerException



这是我第一次使用Fragments,我不太了解如何管理它们。在这种情况下,我有两个片段,我在id为fragment_place的framayout中动态显示。问题可能与fragmentTransaction(addtobackstack/popbackstack)有关。

在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();
}}

我就是这样做的,它对我很有效:

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

我解决了摆脱sendbroadcast()和broadcastReceiver()的问题,而不是现在我调用showPopup()直接从mainActivity当我需要它

最新更新