2017-08-09 89 views
0

我有一個活動(AppCompatActivity)(稱爲活動)和兩個片段(稱爲片段A和片段B)。Android菜單中的片段不reaload

活動開始時,我使用setContentView並生成了片段A.

當我嘗試啓動具有特定參數的Activity時,我午餐片段B. 片段A和片段B具有相同的佈局,我只更改要呈現的數據。

在片段A中,我有一個菜單項,它對我的​​視圖執行一個操作:將列表更改爲網格佈局。

在片段B中,我也有這個菜單,但是當我點擊這個項目時沒有任何變化。所以我在調試模式下試過這個。我已經看到,當我按下菜單中的項目時,對於片段B,這稱爲片段A的菜單動作。

如何解決此循環?

+0

我可以幫助你,在這裏發佈你的代碼,這可能有所幫助:不要從你的片段中的onCreateOptionsMenu調用超級 – stallianz

+0

我建議你在Fragment中覆蓋OnCreateOptionsMenu()方法,並在兩個地方處理而不是活動。 –

+0

當你說「當我嘗試用特定的參數我午餐片段B開始活動」時,這是否意味着你同時啓動**片段A和片段B,或者** **片段B? –

回答

1

當您選擇一個菜單項時,系統會將該事件分派給活動的Activity以及所有當前活動的Fragment。該事件將按照添加到活動中的順序分派給碎片。

如果片段A片段B既包括onOptionsItemSelected()實現的用於同一R.id不變,這將導致你所看到的問題。

例如,假設片段A具有這樣的代碼:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.action_settings) { 
     // do some Fragment A thing 
    } 
    ... 
} 

然後想象片段B具有這樣的代碼:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.action_settings) { 
     // do some Fragment B thing 
    } 
    ... 
} 

即使上R.id.action_settings用戶點擊片段B內部時,系統將將事件發送到碎片A,碎片A將愉快地處理它!

這個問題有幾種不同的解決方案。

首先,您可以在兩個片段中更改菜單,使它們具有相同的文本標籤但使用不同的android:id屬性(然後相應地更新您的片段代碼)。現在只有「右」片段才能夠處理項目選擇事件。

其次,你可以更新您的onOptionsItemSelected()代碼來確定片段是否是當前活動,而忽視了事件如果不是:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (!isAdded() || !isVisible()) { 
     return false; 
    } 

    if (item.getItemId() == R.id.action_settings) { 
     // do some Fragment A thing 
    } 
} 

最後,你可以使用動態生成的ID爲你的菜單項。我建議不要採用這種方法,因爲它比其他方法複雜得多。