2015-12-04 2 views
0

У меня есть такой сценарий:Меню на фрагменты

У меня есть деятельность, позволяет называть его Acitivty1 с

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    return false; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return false; 
} 

открыть фрагмент из Activity1 позволяет называть его Fragment1 с:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    setHasOptionsMenu(true); 

    View view = inflater.inflate(R.layout.layout, container, false); 

    return view; 
} 

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

    if (menu != null){ 

     menu.clear(); 
    } 

    if (!boolean) { 

     inflater.inflate(R.menu.menu1, menu); 

    } else { 

     inflater.inflate(R.menu.menu2, menu); 
    } 
} 

Этот фрагмент будет снова вызван из активности как новый экземпляр.

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

У меня нет подсказки, почему это происходит?

Как это рабочий процесс для отображения опций меню ...

ответ

0

В таком случае, как это, вам нужно поместить меню в деятельности и обновление меню динамически в onPrepareOptionsMenu()

2
if (menu != null){ 
    menu.clear(); 
} 

Этот фрагмент кода может быть первопричину.

Вы сообщаете системе, чтобы очистить menu, если это null. Ну, FYI, menu никогда не будет null в первую очередь; он предоставляется системой. У него, возможно, нет предметов внутри, но он никогда не будет null.

Один из способов проверить, есть ли у menu элемент (или более) для звонка hasVisibleItems().

От документаций:

общественный абстрактный логический hasVisibleItems()

Возвращает True, если есть один или более пункт виден, иначе ложь.

Таким образом, это то, как вы должны это сделать:

if (menu.hasVisibleItems()){ 
    menu.clear(); 
} 
+0

Nope , это не помогает –

0

Вам нужно inflate меню в onCreateOptionsMenu(..) вашего Activity1 и нужно сделать возвращение true, чтобы отобразить меню.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    //Your code here 
    getMenuInflater().inflate(R.menu.main1, menu);//My menu 
    return true; 
} 

После этого вы также получите меню в своем фрагменте.

редактирует:

Если вы используете один файл меню и show/hideMenuItem вашего меню. он решит вашу проблему. Добавить все меню в один файл.по умолчанию все пункты меню видны ложные используя android:visible="false"

Смотрите пример кода:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuItem item1 = menu.getItem(0); 
    MenuItem item2 = menu.getItem(1); 
    MenuItem item3 = menu.getItem(2); 
    MenuItem item4 = menu.getItem(3); 
    if(!boolean){ 
    //visible items which you want to show when boolean is false 
    item1.setVisible(true); 
    item2.setVisible(true); 
    } 
    else 
    { 
    //visible items which you want to show when boolean is true 
    item3.setVisible(true); 
    item4.setVisible(true); 
    } 


    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.menuItem1) { 

     return true; 
    } 
    if (id == R.id.menuItem2) { 

     return true; 
    } 
    ... 
    return super.onOptionsItemSelected(item); 
} 
+0

это не поможет, мне нужны два разных меню, для двух разных экземпляров одного и того же фрагмента –

+0

это не сработает, булев обновляется в активности, когда я запустил второй экземпляр фрагмента –

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