【问题标题】:Android - NullPointerException in Fragment after callbackAndroid - 回调后片段中的 NullPointerException
【发布时间】:2016-11-13 03:44:26
【问题描述】:

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

在 Fragment2 中,当我按下移动设备上的 menubutton 时,我会显示一个 popupmenu,它第一次按预期工作,但是在我返回上一个片段并现在返回 fragment2 之后如果我按下 menubutton,我会收到以下错误

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

【问题讨论】:

    标签: java android android-fragments android-view


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-14
        • 2015-10-12
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多