mam prostą aplikację z menu opcji, która zmienia się na początku fragmentów. Problem polega na tym, że na początku wszystkie fragmenty oprócz pierwszego onCreateOptionsMenu() wywoływane są dwa razy - wewnątrz onCreate() i po onResume(). W onCreate() nazywam to manualy za pomocą setHasOptionsMenu (true), ale po onResume() nie powinno to mieć miejsca. Poza tym, występuje to tylko po rozpoczęciu pierwszego fragmentu.onCreateOptionsMenu() nazywa się dwa razy w Fragment
Oto fragmenty kodu bazowe:
class BaseFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle clicks
return true;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Create a menu
super.onCreateOptionsMenu(menu, inflater);
}
}
A zmieniając fragmenty kodu w aktywny:
public void startFragment(BaseFragment fragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, fragment)
.commit();
}
Próbka nie korzysta z żadnej zewnętrznej biblioteki, jak ActionBarSherlock tylko SupportLibrary. Przypuszczam, że problem tkwi w metodzie FragmentTransaction replace(), ponieważ działa poprawnie po uruchomieniu pierwszego fragmentu. Ale nie wiem, gdzie zacząć rozwiązywać problem. Potrzebuję dokładnie zastąpić fragment w widoku.
Jakiego telefonu używasz? Jeśli telefon ma dedykowany przycisk menu, menu onCreateOptionsMenu będzie wywoływane tylko wtedy, gdy użytkownik je kliknie. Aby dodać, nie jest obowiązkowe, aby setHasOptionsMenu (true) wywoływał onCreateOptionsMenu. Po prostu informuje ramy, że fragment chciałby uczestniczyć w wypełnianiu menu. – prijupaul
OP nie pozwala mi nawet dodawać/edytować pytania, gdy mam ten sam problem. Znam podstawowe rzeczy na temat Menu, problem jest dziwny jak OP opisane. EDYCJA: używam zagnieżdżonego fragmentu – Zyoo
@prijupaul to w rzeczywistości tylko dla wersji przed ubojem. Na Honeycomb i później na CreateOptionsMenu zostanie wywołany natychmiast po wywołaniu setHasOptionsMenu(). – bvitaliyg