當您選擇一個菜單項時,系統會將該事件分派給活動的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爲你的菜單項。我建議不要採用這種方法,因爲它比其他方法複雜得多。
我可以幫助你,在這裏發佈你的代碼,這可能有所幫助:不要從你的片段中的onCreateOptionsMenu調用超級 – stallianz
我建議你在Fragment中覆蓋OnCreateOptionsMenu()方法,並在兩個地方處理而不是活動。 –
當你說「當我嘗試用特定的參數我午餐片段B開始活動」時,這是否意味着你同時啓動**片段A和片段B,或者** **片段B? –