EDYCJA: To pytanie dotyczyło wycofanego paska akcji Sherlocka. Zamiast tego należy teraz użyć biblioteki obsługi systemu Android
Dodałem opcję menu paska akcji o nazwie udostępnij dla mojego, fragment
która pojawia się, ale zdarzenie selekcji nie jest przechwytywane
Dodam to w ten sposób
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
MenuItem item = menu.add(0, 7,0, R.string.share);
item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
Próbując uchwycić to zarówno w jak fragment
i tym fragment activity
podobnych
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 7:
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
startActivity(Intent.createChooser(share, "Share Text"));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
i mam setHasOptionsMenu(true);
w onCreate()
.
źródło
Miałem ten sam problem, ale myślę, że lepiej podsumować i przedstawić ostatni krok, aby to zadziałało:
Dodaj
setHasOptionsMenu(true)
metodę w metodzie fragmentuonCreate(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 fragmencie.Wewnątrz
onOptionsItemSelected(MenuItem item)
metody działania upewnij się, że powrócisz,false
gdy akcja elementu menu zostanie zaimplementowana wonOptionsItemSelected(MenuItem item)
metodzie Fragment .Przykład:
Czynność
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Do Activity menu item stuff here return true; case R.id.fragment_menu_item: // Not implemented here return false; default: break; } return false; }
Fragment
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); .... } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Do something that differs the Activity's menu here super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Not implemented here return false; case R.id.fragment_menu_item: // Do Fragment menu item stuff here return true; default: break; } return false; }
źródło
return false
na AktywnościonOptionItemSelected
jest kluczem. wystarczy wymienićreturn super.onOptionItemSelected(item);
Zauważyłem, że rozwiązaniem, które dali ci ludzie, było zaimplementowanie kodu dla twojego elementu menu w ćwiczeniu, a nie fragmentu. Myślę, że wyglądałoby to na znacznie bardziej zorganizowane, gdybyś zaimplementował kod we fragmencie, a nie działanie, bo moim zdaniem wygląda lepiej. Aby to zrobić, wykonaj następujące czynności:
Czynność
@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.SomeIDInTheMenueOfTheActivity: { //something(); break; } default: //do something default and add the code under : return super.onOptionsItemSelected(item); } return true; }
Fragment
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.SomeIDInFragmentMenue: { break; } default: return super.onOptionsItemSelected(item); } return true; }
Teraz wiersze (i polubienia): "return super.onOptionsItemSelected (item);" w działaniu i fragment są bardzo ważne, ponieważ tak jakbyś podążał za kodem podczas debugowania, zobaczysz, że funkcje zdarzeń menu zostaną wywołane jako pierwsze w działaniu, a jeśli element nie będzie pasował do identyfikatorów w przełączniku działania case, wiersz degault: "super.onOptionsItemSelected (item);" wywoła funkcję onOptionsItemSelected na fragmencie, tak jak chcieliśmy. (jeśli masz wiele fragmentów, upewnij się, że masz w nich również tę linię, ponieważ hirarchia wywoływania może być nieco skomplikowana).
źródło
Używam actionbarsherlock. To zadziałało dla mnie:
1) Utwórz menu dummy_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" > <item android:title="" android:showAsAction="never" android:id="@+id/dummyMenu" />
2) W aktywności napompuj menu w ten sposób:
@Override public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) { com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.dummy_menu,menu); return super.onCreateOptionsMenu(menu); }
3) We fragmentach wywołania onCreateView setHasOptionsMenu (true) i przesłonięcia onCreateOptionsMenu i onOptionsItemSelected również ukryj dummyMenu w ten sposób (we fragmencie)
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_actions, menu); MenuItem item = menu.findItem(R.id.dummyMenu); item.setVisible(false); super.onCreateOptionsMenu(menu, inflater); }
Mam nadzieję, że to komuś pomoże.
źródło
Edytuj, aby użyć paska akcji Sherlock
Musiałem użyć
public boolean onMenuItemSelected(int featureId, MenuItem item) {
w głównym działaniu, aby uchwycić element menu
źródło
onContextItemSelected
zamiastonOptionsItemSelected
. PoonMenuItemSelected
prostu przekazuje kliknięcie do właściwej metody, dlatego wydaje się, że działa lepiej.jest to tak proste, że możesz to zrobić w swoim fragmencie, aby upewnić się, że Twoja akcja będzie poprawnie nasłuchiwała:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); }
źródło
Miałem ten problem. To dlatego, że wybrałem złą metodę
Użyłem onOptionsItemSelected (com.actionbarsherlock.view.MenuItem item).
Upewnij się, że używasz właściwego!
źródło
W metodach aktywności nie przywiązujesz się do superklasy. Proszę mieć onCreateOptionsMenu () return super.onCreateOptionsMenu (menu) i mieć onOptionsItemSelected () return super.onOptionsItemSelected (item) (z wyjątkiem pozycji, którą obsługujesz, która powinna zwrócić true, aby wskazać, że obsłużyłeś zdarzenie)
źródło
musisz dodać ten kod do
toolbar.bringToFront();
następnego zestawu narzędzi w swoim działaniupublic class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { ... Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle("Yazd"); setSupportActionBar(toolbar); toolbar.bringToFront(); // <<= add here ...
źródło