Próbuję dodać element do menu opcji z grupy fragmentów.
Utworzyłem nową MenuFragment
klasę i rozszerzyłem ją o fragmenty, w których chcę uwzględnić element menu. Oto kod:
Jawa:
public class MenuFragment extends Fragment {
MenuItem fav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Kotlin:
class MenuFragment : Fragment {
lateinit var fav: MenuItem
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Z jakiegoś powodu onCreateOptionsMenu
wydaje się, że nie działa.
android
android-fragments
android-optionsmenu
misterbassman
źródło
źródło
Odpowiedzi:
Wywołaj metodę super:
Jawa:
Kotlin:
Umieść instrukcje dziennika w kodzie, aby sprawdzić, czy metoda nie jest wywoływana lub czy menu nie jest zmieniane przez kod.
Zapewniają również dzwonisz
setHasOptionsMenu(boolean)
wonCreate(Bundle)
powiadomić fragment, który powinien uczestniczyć w obsłudze menu opcji.źródło
Miałem ten sam problem, ale myślę, że lepiej podsumować i wprowadzić ostatni krok, aby go uruchomić:
Dodaj metodę setHasOptionsMenu (true) do metody swojego fragmentu
onCreate(Bundle savedInstanceState)
.Zastąp
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(jeśli chcesz zrobić coś innego w menu swojego Fragmentu) ionOptionsItemSelected(MenuItem item)
metody w swoim Fragmentie.W
onOptionsItemSelected(MenuItem item)
metodzie działania upewnij się, że zwrócisz fałsz, gdy akcja elementu menu zostanie zaimplementowana wonOptionsItemSelected(MenuItem item)
metodzie Fragmentu.Przykład:
Czynność
Fragment
źródło
setHasOptionsMenu(true);
DziękiJeśli okaże się, że
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
metoda nie jest wywoływana, upewnij się, że wywołujesz następująceonCreate(Bundle savedInstanceState)
metody z metody Fragment :źródło
Toolbar
i musiałem zadzwonićsetHasOptionsMenu(true)
wonCreateView()
zamiastonCreate()
zrobić to.Jeśli potrzebujesz
menu
odświeżeniawebview
wewnątrz określonegoFragment
, możesz użyć:Fragment :
menu.xml
źródło
TL; DR
Użyj
android.support.v7.widget.Toolbar
i po prostu zrób:Samodzielny pasek narzędzi
Większość sugerowanych rozwiązań, takich jak,
setHasOptionsMenu(true)
działa tylko wtedy, gdy działanie nadrzędne ma pasek narzędzi w swoim układzie i deklaruje je za pośrednictwemsetSupportActionBar()
. Następnie Fragmenty mogą uczestniczyć w populacji menu tego właśnie paska ActionBar :Jeśli chcesz mieć samodzielny pasek narzędzi i menu dla jednego określonego fragmentu , możesz wykonać następujące czynności:
menu_custom_fragment.xml
custom_fragment.xml
CustomFragment.kt
Tak, to takie proste. Nie musisz nawet zastępować
onCreate()
lubonCreateOptionsMenu()
.PS: Działa tylko z (
android.support.v4.app.Fragment
iandroid.support.v7.widget.Toolbar
pamiętaj, aby użyćAppCompatActivity
iAppCompat
motywu w twoimstyles.xml
).źródło
W
menu.xml
należy dodać wszystkie elementy menu. Następnie możesz ukryć przedmioty, których nie chcesz widzieć przy pierwszym ładowaniu.menu.xml
Dodaj
setHasOptionsMenu(true)
metodę onCreate (), aby wywołać elementy menu w klasie Fragment.FragmentClass.java
Nie musisz ponownie zastępować
onCreateOptionsMenu
w swojej klasie Fragmentów. Pozycje menu można zmienić (Dodaj / usuń), zastępująconPrepareOptionsMenu
metodę dostępną we fragmencie.źródło
Musisz użyć menu.clear () przed napompowaniem menu.
i
źródło
W moim przypadku oto kroki.
Krok 1
Krok 2
Krok 3
źródło
menu.clear()
wyczyszczonego poprzedniego menu. Pracował dla mnie :)Jeśli chcesz dodać własne menu
źródło
Miałem ten sam problem, moje fragmenty były stronami ViewPagera. Dzieje się tak dlatego, że podczas tworzenia FragmentPagerAdapter korzystałem z menedżera fragmentów potomnych, a nie z menedżera fragmentów obsługujących aktywność.
źródło
Plik menu:
Kod działania:
Kod fragmentu:
źródło
Twój kod jest w porządku. W metodzie brakowało tylko super:
źródło
Oszalałem, ponieważ żadna z odpowiedzi tutaj nie zadziałała.
Aby wyświetlić menu musiałem zadzwonić:
setSupportActionBar(toolbar)
Gotowy!
Uwaga: jeśli twój
toolbar
widok nie jest w tym samym układzie aktywności, nie możesz użyć powyższego wywołania bezpośrednio z klasy aktywności, w takim przypadku musisz pobrać tę aktywność z klasy fragmentu, a następnie wywołać metodęsetSupportActionBar(toolbar)
. Zapamiętywanie: twoja klasa aktywności powinna rozszerzać AppCompatActivity.Mam nadzieję, że ta odpowiedź ci pomoże.
źródło
Ustawienie menu opcji po utworzeniu widoku fragmentu działało dla mnie dobrze.
źródło
Mój problem był nieco inny. Zrobiłem wszystko dobrze. Ale odziedziczyłem niewłaściwą klasę dla działania hostującego fragment.
Dla jasności, jeśli przesłonisz
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
fragment, upewnij się, że dziedziczy klasa aktywności, która obsługuje ten fragmentandroid.support.v7.app.ActionBarActivity
(na wypadek, gdybyś chciał obsługiwać poniżej poziomu API 11).Dziedziczyłem
android.support.v4.app.FragmentActivity
do obsługi poziomu API poniżej 11.źródło
Dodam do tego jedną rzecz i powód, dla którego to nie działało.
Jest podobny do odpowiedzi Napstera.
Upewnij się, że działalność hostingowa Twojego fragmentu się rozszerza
AppCompatActivity
, a nieFragmentActivity
!Z Dokumentacji Google dla FragmentActivity:
Aby zaktualizować odpowiedź Napstera -
ActionBarActivity
teraz jest przestarzała, użyjAppCompatActivity
zamiast niej.Podczas używania
AppCompatActivity
upewnij się również, że ustawiłeś „motyw aktywności naTheme.AppCompat
lub podobny motyw” (Dokument Google).Uwaga:
android.support.v7.app.AppCompatActivity
jest podklasąandroid.support.v4.app.FragmentActivity
klasy (patrz dokument referencyjny AppCompatActivity ).źródło
W folderze menu utwórz plik .menu xml i dodaj ten plik xml
W klasie fragmentów pomiń tę metodę i
Teraz po prostu ustaw plik XML menu w klasie fragmentów
źródło
Jeśli wszystkie powyższe funkcje nie działają, musisz debugować i upewnić się, że funkcja onCreateOptionsMenu została wywołana (poprzez umieszczenie dziennika debugowania lub zapisu ...)
Jeśli nie jest uruchomiony, być może motyw Androida nie obsługuje paska akcji. Otwórz plik AndroidManifest.xml i ustaw wartość dla
android:theme
paska akcji obsługi motywów :źródło
na onCreate metody Add setHasOptionMenu ()
Następnie zastąp swoje menu onCreateOptionsMenu
źródło