2016-11-13 2 views
0

Это первый раз, когда я работаю с фрагментами, и я не очень хорошо понимаю, как ими управлять. В этом случае у меня есть два фрагмента, которые я показываю динамически в FrameLayout с id fragment_place. Вероятно, проблема связана с фрагментацией (addtobackstack/popbackstack).Android - NullPointerException во фрагменте после обратного вызова

В Fragment2 я показываю popupmenu, когда я нажимаю кнопку меню на мобильном устройстве, и он работает, как ожидалось, в первый раз, но после того, как я вернусь к предыдущему фрагменту и вернусь к фрагменту2 сейчас. Если я нажму кнопку меню, то получим следующее ошибка

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() и BroadcastReceiver(), вместо из этого теперь я вызываю showPopup() непосредственно из mainActivity, когда мне это нужно.

0

это путь я делаю, и это работает для меня:

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