Другой возможный случай - когда вы используете общий идентификатор для общего действия в каждом фрагменте; например R.id.action_add
Сегодня у меня была такая ситуация: при нажатии меню параметров [добавить] вызывался «неправильный» onOptionItemSelected
, поскольку каждый фрагмент (динамически замененный с помощью DrawerLayout
) имел одинаковые R.id.action_add
.
Короткая история, если у вас такая ситуация, всегда проверяйте, виден ли ваш фрагмент:
if (!isVisible()) return false;
Длинная история, обратите внимание на onOptionItemSelected
цепочку!
MainActivity
|
| onOptionItemSelected
+-----------------------
| return false
|
MyCoolFragment1
|
| onOptionItemSelected
+-----------------------
| return false
|
MyCoolFragment2
|
| onOptionItemSelected
+-----------------------
| return true
|
[item selection handled]
Если вы добавите свои фрагменты с помощью (что-то вроде) этого:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, MyCoolFragment1.newInstance())
.commit()
и вы определили один и тот же идентификатор для общего действия (скажем, R.id.action_add) в каждом фрагменте;
не забудьте добавить эту строку к каждому: if (! isVisible ()) вернет false;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (!isVisible()) return false; // <-- Not visible? skip!
if (item.getItemId() == R.id.action_add) {
//.TODO whatever
return true; //.Handled!
}
return false; //.Skip
}