0

У меня есть Toolbar используется как ActionBar с двумя элементами. Я только хочу когда-либо показывать один за раз, поскольку они вроде заменяют друг друга. Проблема в том, что, когда я заменяю Fragment, он вызывает onCreateOptionsMenu и снова раздувает меню, что означает, что будет показана одна и та же кнопка действия, даже если другая была ранее в ActionBar. Мне нужно будет что-то изменить в ActionBar от моего Fragments или когда появится новый FragmentFragmentManager.FragmentTransaction.replace()). Поэтому мой вопрос в том, как я не вызываю onCreateOptionsMenu, когда отображается новый фрагмент?Как не называтьCreateOptionsMenu при вызове FragmentManager.replace()

Я не могу использовать boolean, потому что мне все равно понадобится, чтобы он заново сменил ориентацию. И какие-либо советы о том, как обращаться с идеей, меняются для моей ситуации?

Я могу отправить код, но он кажется более концептуальным, и я не уверен, что это поможет.

ответ

1

Я решил проблему вместо того, чтобы не звонить onCreateOptionsMenu, я добавил элементы в свое меню вручную.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    boolean refreshVisible; 

    if (refreshItem != null && refreshItem.isVisible()){//is being displayed prior to inflation 
     refreshVisible = true; 
    }else if (refreshItem == null){//it's null so the menu has never been created 
     refreshVisible = true; 
    }else {//it's not null and invisibe, other icon was being displayed 
     refreshVisible = false; 
    } 

    menu.clear();//clear menu so there are no duplicate or overlapping icons 
    getMenuInflater().inflate(R.menu.main, menu);//inflate menu 
    refreshItem = menu.findItem(R.id.refresh); 
    useDataItem = menu.findItem(R.id.use_data); 
    refreshItem.setVisible(refreshVisible);//if menu is being created for first time or item was previously visible, then display this item 
    useDataItem.setVisible(!refreshVisible);//display this item if not displaying other 

    return true; 

} 
0

Я бы поиграл с крюком onPrepareOptionsMenu. Если вы обнаружите, что ваше меню не должно отображаться, вы должны отбросить оттуда ложь. По документации:

Подготовить стандартное меню экрана, которое будет отображаться. Это вызывается прямо перед отображением меню при каждом его показе. Вы можете использовать этот метод для эффективного включения/выключения элементов или, наоборот, динамического изменения содержимого.

и

Вы должны вернуться верно для меню, которое будет отображаться; если вы вернете false, оно не будет показано.

+0

Я сделал это где 'onPrepareOptionsMenu' возвращает ложь, и это не вызывает' onCreateOptionsMenu', но 'onCreateOptionsMenu' называли перед ним. –

+0

Да, потому что в первый раз onCreateOptionsMenu вызывается в конце метода onCreate Activity. Я не уверен, будет ли это работать, но попробуйте подход, который предложил @OmarAlbelbaisy. – MatBos

+0

Нет, я имею в виду, что 'onCreateOptionsMenu' вызывается перед новой транзакцией фрагмента. Я сделал то, что он предложил. Я не думаю, что это помогло. Я решил свою проблему, вручную раздувая «Меню». –

0

Вы можете позвонить setHasOptionsMenu(false); внутри вашего фрагмента.

Это предотвратит вызов onCreateOptionsMenu() при добавлении этого фрагмента.

+0

Я поместил это во все мои фрагменты, и он все еще вызывался, но я решил это, вручную установив элементы. См. Мой ответ –

+0

Фактически, когда я устанавливаю его в false, 'onCreateOptionsMenu()' не вызывается в моем фрагменте, но он все еще вызывался в моей активности каждый раз, когда произошла транзакция фрагмента. –

+0

Попробуйте вызвать menu.clear(); в вашей активности onCreateOptionsMenu(), чтобы очистить предыдущие добавленные элементы до раздувания меню. –

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

  • Нет связанных вопросов^_^