2013-08-08 3 views
17

Мой фрагмент заменяет родительские параметры действия определенным элементом параметра, но когда я нажимаю на элемент, вызывается только событие активности onOptionItemSelected, хотя я переопределил метод внутри фрагмента. Я что-то упускаю?Fragment's onOptionsItemSelected не получает вызов

методы фрагмента:

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 

    Log.d(TAG, "Fragment.onCreateOptionsMenu"); 

    if (mPasteMode) { 
     menu.clear(); 
     inflater.inflate(R.menu.contexual_paste, menu); 
     getActivity().getActionBar().setTitle("PasteMode"); 
    } 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "Fragment.onOptionsItemSelected"); 

    switch (item.getItemId()) { 
     case R.id.context_action_paste: 
      Toast.makeText(getActivity(), 
        "It worked ", 
        Toast.LENGTH_SHORT).show(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

методы на данный вид деятельности: выходные

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "MainActivitiy.onOptionsItemSelected"); 
    switch (item.getItemId()) { 
     case R.id.action_refresh: 
      Toast.makeText(this, "Action Refresh selected", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      break; 
    } 
    return true; 
} 

Logcat:

MainActivity.onCreateOptionsMenu 
Fragment.onCreateOptionsMenu 
MainActivitiy.onOptionsItemSelected 

Итак, как я могу получить onOptionsItemSelected фрагмента?

ответ

30

Вы не привязываетесь к суперклассу в методах деятельности. Пожалуйста, примите onCreateOptionsMenu() return super.onCreateOptionsMenu(menu) и получите onOptionsItemSelected()super.onOptionsItemSelected(item) (за исключением элемента, который вы обрабатываете, который должен вернуть true, чтобы указать, что вы обработали событие).

+0

Спасибо, что решили проблему. – Nima

+4

Следует отметить, что setHasOptionsMenu (true) должен был быть вызван во фрагменте for is –

+0

cheers @TashPemhiwa – Patric

26

Если данный вид деятельности onOptionsItemSelected методу returs истинные, вызов потребляются в деятельности и onOptionsItemSelected фрагментировать не называется. Итак, return false в вашей деятельности onOptionsItemВыбранный метод или реализация родительского класса через super.onOptionsItemВыбранный вызов (реализация по умолчанию возвращает false).

По классу активности Javadoc, метод Activity.onOptionsItemSelected должен:

Возврат ложно, чтобы нормальная обработка меню, чтобы продолжить, правда, чтобы потреблять его здесь

+0

Большое спасибо, это очень ясный ответ –

+0

Удивительный, решил мою проблему !!! – Jenny

+0

Спасибо, что вы спасли мое время. – Shailesh

5

В моем случае я не добавлять никаких пункты меню (т.е. я не вызывал onCreateOptionsMenu в активности или фрагменте). Тем не менее, мне нужно было использовать кнопку панели действий (вверх) в фрагменте. Для этого я должен был убедиться, что setHasOptionsMenu(true) был вызван в методе onCreateView() фрагмента, прежде чем это может сработать. Тогда я не нуждался в переопределении onOptionsItemSelected в своей деятельности.

Смежные вопросы