2010-07-01 64 views
6

我有一個問題,使用ActivityGroup。我在ActivityGroup內有兩個活動,他們都使用菜單(覆蓋onCreateOptionMenu和onOptionsItemSelected)。Android ActivityGroup菜單問題

嗯,問題是,當我按菜單鍵時,組中的第二個活動不顯示菜單。第一項活動很好地顯示菜單。

有關此問題的任何想法?

我有這樣的代碼中的子活動:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    boolean result = super.onCreateOptionsMenu(menu); 
    menu.add(0, MENU_REFRESH, 0, R.string.menu_refresh).setIcon(R.drawable.ic_menu_refresh); 
    return result; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case MENU_REFRESH: 
     Log.d(TAG,"REFRESH"); 
     refresh(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

我覺得這是第二次的驚人行爲活動。嘗試在第二個活動中選擇任何控件,然後按菜單按鈕。菜單會出現,但我不知道爲什麼。 – 2011-03-08 10:21:29

+0

我有同樣的問題,我也得到第二個活動相同的菜單。即使我有一個單獨的菜單定義第二個活動。請讓我知道如何解決這個問題 – Sam 2012-02-14 12:53:09

回答

1

檢查this線程。

菜單的可以在父 aactivity處理,但是創造了孩子 活動

+0

好的,但我如何調用子活動的方法,如果我處理父活動中的菜單? – xger86x 2010-07-01 13:51:49

+0

@ xger86x:這是問題所在。您應該在不屬於父級的子級活動中處理該菜單。 – Macarse 2010-07-01 14:10:42

+0

@macarse確定如此....我該怎麼做?你明白我的問題嗎?如果我必須調用子活動的方法,我不能從父項活動中獲得。 – xger86x 2010-07-01 14:12:13

7

處理另一種很好的方式,這是使用的ActivityGroup的LocalActivityManager。獲取本地活動管理,獲得當前活動,以及執行活動的適當的方法:

public boolean onPrepareOptionsMenu(Menu menu) { 
    //super.onPrepareOptionsMenu(menu); 
    return getLocalActivityManager().getCurrentActivity() 
     .onCreateOptionsMenu(menu); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    //super.onCreateOptionsMenu(menu); 
    return getLocalActivityManager().getCurrentActivity() 
     .onCreateOptionsMenu(menu); 
} 

public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    //super.onMenuItemSelected(featureId, item); 
    return getLocalActivityManager().getCurrentActivity() 
     .onMenuItemSelected(featureId, item); 
} 

注:使用這​​種策略,你不能從孩子叫super.onCreateOptionsMenu活動 - 這樣做會導致堆棧溢出異常。我不確定在*方法上調用超類的目的是什麼,因爲我省略了它們,並且沒有看到任何負面結果。 (...)

1

另一種方法是在ActivityGroup根目錄中創建菜單,然後使用公共布爾值onPrepareOptionsMenu(菜單菜單)清除並重新添加菜單項。

在的ActivityGroup類:

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    //what is the current activity? 
    menu.add(0, 0, 0, "holder"); 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    //start a new 
    menu.clear(); 
    //add some menu options 
    .getLocalActivityManager().getCurrentActivity().onPrepareOptionsMenu(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

在活動時間:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ //add menus or inflate here 
    return true; 
} 
2

你需要重寫活動組中的菜單的方法,並調用相應的方法關於孩子的活動。看到這篇文章:How to Create Options Menu on Child Activity inside an ActivityGroup

public class TestGroup extends ActivityGroup { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //start child activity 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item); 
    } 
} 
2

使用的tabGroupActivity

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // TODO Auto-generated method stub 


    return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    // TODO Auto-generated method stub 
    return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item); 
} 

使用這兩個2個活動如下代碼這段代碼

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.menu_1, menu); 
    return true; 
}// menu_1 is the xml file in menu folder 
@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.weekly: 
     Intent weekly = new Intent(getParent(),Activity1.class); 
     TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
     parentActivity.startChildActivity("weeklyview", weekly); 

     break; 

    case R.id.daily : 
     Intent daily = new Intent(getParent(),Activity2.class); 
     TabGroupActivity parentActivity2 = (TabGroupActivity)getParent(); 
     parentActivity2.startChildActivity("daily", daily); 
     break; 

    default: 
     break; 
    } 

    //use return true 
return true; 
}