9

我有一個活動可以包含幾個片段。每個片段都可以在ActionBar中擁有自己的菜單項。這到目前爲止工作得很好,每個項目都是可點擊的,並執行所需的操作。OnOptionsItemSelected in activity在onOptionsItemSelected之前調用片段。其他方式可能嗎?

我的問題是以下。在MainActivity我聲明瞭以下行攔截的動作條的HomeIcon電話:

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      clearBackStack(); 
        setHomeFragment(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 

     } 
    } 

我宣佈它的活動,因爲我想,每一個片段應該調用,這樣我就不必趕android.R.id.home每個片段中的情況。

在一個片段中,我使用了setDisplayHomeAsUpEnabled(true),以便獲取ActionBar圖標左側的小箭頭。當在這個片段中點擊HomeIcon時,我不想設置HomeFragment,我想設置上次顯示的片段。所以我有一個onOptionsItemSelected - 片段中的方法:

@Override 
public boolean onOptionsItemSelected(MenuItem menuItem) { 

    switch (menuItem.getItemId()) { 
    case android.R.id.home: 
     setLastFragment(); 
       return true; 
    ... 

然而,這並不工作,我想它的工作方式。首先調用Activity的onOptionsItemSelected,獲取MenuItem並重定向到HomeFragment。與其他片段中聲明的其他MenuItems我可以檢查看到相同的行爲。 Activity首先被調用,不會捕獲MenuItem(默認情況),然後重定向到super.onOptionsItemSelected(item)。

所以這似乎是Android處理菜單點擊的情況。第一個活動,然後片段。有沒有辦法改變這個?我不想將android.R.id.home-case放在每個片段中並在那裏處理。有沒有更好的方法來做到這一點?

回答

4

據開發商參考,

「返回false,允許正常的菜單處理,繼續進行,真到這裏吃了。」

所以我會嘗試在活動的執行onOptionsItemSelected()返回的「假」在默認情況下,這種方式如果沒有抓到事件將傳遞給片段的實現。

+9

這不是MrHill所要求的!我面臨同樣的問題。通常情況下,活動處​​理「自上而下」按鈕。有時我們希望在某個片段當前處於活動狀態時按下「Home UP」按鈕時執行特殊操作。在Activity onOptionsItemSelected上返回false將阻止活動處理該事件。 – John

1

不知道是否有可能。在這裏提供的官方文檔:

http://developer.android.com/guide/topics/ui/actionbar.html#ActionEvents

有一個說明,指出以下:

[...]然而,該活動都將有機會先處理該事件,因此係統在調用該片段的相同回調之前,首先在活動上調用onOptionsItemSelected()。

+1

只要你在Fragment的生命週期的早期階段調用'setHasOptionsMenu(true)',它就是可能的,例如,在'onCreateView()'中 –

8

我只是遇到這個問題,我已經使用下面的代碼工作。 在活動的onOptionsItemSelected功能,添加:

if (id == android.R.id.home){ 
     Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container); 
     if(null != currentFragment && currentFragment.onOptionsItemSelected(item)){ 
      return true; 
     } 
    } 

而在片段的onOptionsItemSelected方法,你處理相應的事情。 以這種方式,如果片段有任何事情要做的菜單項,它會做到這一點,並返回true來停止任何其他進程。 如果片段與此項目沒有任何關係,它將返回false或調用super.onOptionsItemSelected方法,該方法可能最終返回false以讓其他人處理它。

相關問題