OnOptionsItemSelected в activity вызывается перед onOptionsItemSelected во фрагменте. Другой способ возможен?
у меня есть действие, которое может содержать несколько фрагментов. Каждый из фрагментов может иметь свои собственные записи меню в ActionBar. Это прекрасно работает до сих пор, и каждый элемент является интерактивным и выполняет желаемое действие.
моя проблема заключается в следующем. В MainActivity я объявил следующие строки для перехвата вызовов в HomeIcon ActionBar:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
clearBackStack();
setHomeFragment();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Я объявил об этом в Activity, потому что я хотел, чтобы каждый фрагмент вызывал это так, чтобы я не нужно ловить андроида.R.id.домашний кейс в каждом фрагменте.
в одном фрагменте я использую setDisplayHomeAsUpEnabled (true), так что я получаю маленькую стрелку слева от значка ActionBar. Когда HomeIcon щелкнут в этом фрагменте, я не хочу устанавливать HomeFragment, я хочу установить фрагмент, который был последним отображен. Поэтому у меня есть метод onOptionsItemSelected - во фрагменте:
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case android.R.id.home:
setLastFragment();
return true;
...
однако это не работает так, как я хотел, чтобы это работало. деятельность onOptionsItemSelected вызывается первым, ловит MenuItem и перенаправляет на HomeFragment. С другими MenuItems, объявленными в других фрагментах, я могу проверить то же самое поведение. Сначала вызывается Activity, не улавливает MenuItem (случай по умолчанию), а затем перенаправляется на super.onOptionsItemSelected (item).
таким образом, кажется, что это так, как Android обрабатывает щелчки меню. Сначала действие, затем фрагмент. Есть ли способ изменить это? Я не хочу ставить андроид.R.id.home-case в каждом фрагменте и обрабатывать его там. Есть ли лучший способ сделать это?
4 ответов
согласно ссылке разработчиков,
"верните false, чтобы продолжить обычную обработку меню, true, чтобы использовать его здесь."
поэтому я бы попытался вернуть "false" по умолчанию в реализации действия onOptionsItemSelected(), таким образом, событие перейдет к реализации фрагмента, если оно не будет поймано.
Я просто сталкиваюсь с этой проблемой, и я заставил ее работать, используя следующий код. В деятельности
Не уверен, что это возможно. В официальных документах, доступных здесь:
http://developer.android.com/guide/topics/ui/actionbar.html#ActionEvents
есть примечание, в котором указано следующее:
[...] Однако действие получает возможность сначала обработать событие, поэтому система сначала вызывает onOptionsItemSelected () для действия перед вызовом того же обратного вызова для фрагмента.
вы можете сделать как @, конечно, написано, это отличная идея, но в этом случае вы будете называть onOptionsItemSelected
на фрагменте, не зная, какой фрагмент это, и вы должны переопределить onOptionsItemSelected
метод во всех ваших фрагментов.
если вы хотите вызвать этот метод только для определенных фрагментов, вы должны найти их по тегу, который вы использовали при их добавлении:
case android.R.id.home:
Fragment frag = getSupportFragmentManager()
.findFragmentByTag(FRAGMENT_TAG);
if(frag != null && frag.isVisible() && frag.onOptionsItemSelected(item)) {
return true;
тег указывает следующим образом:
fragmentManager.beginTransaction()
.add(containerId, fragment, FRAGMENT_TAG)