ViewPager и странное поведение контекстного меню

Сделал программку с ViewPager-ом, все красиво перелистывается, поехал дальше и наткнулся на странный баг. Фрагменты, которые у меня перелистывает ViewPager — это один и тот же класс, но в зависимости от параметров, они содержат разные элементы (соответствующий layout подключается в onCreateView() класса). Прикрутил к одному полю ввода в одном из фрагментов контекстное меню и словил странное поведение…

Смысл следующий. В onCreateView() фрагмента получил через findViewById() объект своего поля ввода и сохранил в глобальной переменной edit. Далее, сделал registerForContextMenu(edit) для этого поля ввода. Все отлично. Контекстное меню показывается, проблем нет.

Далее, в обработчике контекстного меню делаю edit.setText(«blablabla») своему полю ввода и ловлю NullPointerException: отладчик говорит, что моя переменная edit равна null!

C какого перепуга? А вот с какого: оказывается при выборе пункта контекстного меню обработчик onContextItemSelected() класса фрагмента вызывается сразу для всех существующих фрагментов. Т.е. для тех фрагментов, где моего поля ввода нету, он вызывается тоже, а там, конечно же, моя переменная равна null…

Вот такая хренька. Пришлось искать решение. Перепробовал кучу всего, но сработало только одно решение, о нем, собственно, и хотел написать:


@Override
public boolean onContextItemSelected(MenuItem item) {

	if (getUserVisibleHint()) {
		switch (item.getItemId()) {
		case ITEM_1:
			edit.setText("blablabla");
			return true;

		...

		}
	}

	return false;
}

Гвоздем программы явился вызов непонятного метода getUserVisibleHint(), который возвращает true если текущий фрагмент виден пользователю. Таким образом, контекстное меню вызывается сразу для всех фрагментов, но нужная обработка идет только в том фрагменте, который сейчас на экране.

Странно, но работает…

Комментирование запрещено